python,在for循环中创建多个matplotlib按钮小部件



我需要在matplotlib中生成可变数量(总计(的按钮小部件,并让每个小部件在变量var中存储不同的数字。

import matplotlib.pyplot as plt
from matplotlib.widgets import Button as BT
total = 4
class Index:
ind = 0

def plot_pick(self, event):
var=event
print(var)
ax_chooseplot={}
chooseplot_BT={}
callback=Index()
for i in range(0,total):
loc=0.95-i*0.03
ax_chooseplot[i] = plt.axes([loc-0.002, 0.87, 0.02, 0.03])
chooseplot_BT[i] = BT(ax_chooseplot[i], '')
chooseplot_BT[i].on_clicked(callback.plot_pick(i))         

plt.show()

此代码按顺序打印i,然后按下任何按钮:

TypeError: 'NoneType' object is not callable

它看起来像是函数";plot_pick";在for循环期间被调用,然后i的值被丢弃?

我已经看到tkinter按钮解决了这个问题,但我无法将这些答案应用于matplotlib嵌入式按钮。有什么简单的方法可以解决这个问题吗?

问题来自于将i参数传递给plot_pick函数的方式。将其直接传递给函数是行不通的。一种可能的替代方案是使用functools.partial。你可以在下面找到一个例子,我使用functools.partial打印点击按钮的索引:

import matplotlib.pyplot as plt
from matplotlib.widgets import Button as BT
import functools
total = 4
class Index:
ind = 0
def plot_pick(self,i, event):
print('Button '+str(i))

ax_chooseplot={}
chooseplot_BT={}
callback=Index()

for i in range(0,total):
loc=0.95-i*0.03
ax_chooseplot[i] = plt.axes([loc-0.002, 0.87, 0.02, 0.03])
chooseplot_BT[i] = BT(ax_chooseplot[i], str(i))
chooseplot_BT[i].on_clicked(functools.partial(callback.plot_pick,i))  


plt.show()

最新更新