如果我在函数内部定义了一个Button click处理程序,它就不起作用。在下面的示例中,图f1和f2看起来相同,但只有当我按下f2上的按钮时,它才会产生输出。
from matplotlib import pyplot as plt
from matplotlib.widgets import Button
def handler(*args, **kwargs):
print('handled')
def testfn():
f1 = plt.figure('f1')
b1 = Button(f1.add_axes([0.4, 0.3, 0.1, 0.04]), 'Click!')
b1.on_clicked(handler)
f2 = plt.figure('f2')
b2 = Button(f2.add_axes([0.4, 0.3, 0.1, 0.04]), 'Click!')
b2.on_clicked(handler)
testfn()
plt.show()
答案 0 :(得分:3)
由于the documentation只讲述任何小部件,
要使按钮保持响应,您必须保留对它的引用。
因此,您需要从函数返回按钮以保持对它的引用(button = testfn()
),否则在函数返回后将立即对其进行垃圾回收。
这个例子看起来像这样:
from matplotlib import pyplot as plt
from matplotlib.widgets import Button
def handler(*args, **kwargs):
print('handled')
def testfn():
f1 = plt.figure('f1')
b1 = Button(f1.add_axes([0.4, 0.3, 0.1, 0.04]), 'Click!')
b1.on_clicked(handler)
return b1
f2 = plt.figure('f2')
b2 = Button(f2.add_axes([0.4, 0.3, 0.1, 0.04]), 'Click!')
b2.on_clicked(handler)
button = testfn()
plt.show()