#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. Пожалуйста. Если вы довольны результатами, вы можете отметить вопрос как ответ, поставив зеленую галочку рядом с моим ответом. Тх!