python, создайте несколько виджетов кнопок matplotlib в цикле for

#python #for-loop #matplotlib #tkinter #button

#питон #для-петли #matplotlib #tkinter #кнопка

Вопрос:

Мне нужно сгенерировать переменное число (общее) виджетов кнопок в 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()  

Этот код печатается последовательно, затем при нажатии любой кнопки:

TypeError: 'NoneType' object is not callable

Похоже, что функция «plot_pick» вызывается во время цикла for, а затем значение i отбрасывается?

Я видел, как эта проблема решалась для кнопок tkinter, но я не смог применить эти ответы к встроенным кнопкам matplotlib. Есть ли простой способ решить эту проблему?

Ответ №1:

Проблема возникает из-за того, как вы передаете 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()  

Комментарии:

1. Спасибо, это сработало!

2. Пожалуйста. Если вы довольны результатами, вы можете отметить вопрос как ответ, поставив зеленую галочку рядом с моим ответом. Тх!