matplotlib 函数内的按钮单击处理程序不起作用

Gle*_*leb 1 python matplotlib

如果我在函数内定义按钮单击处理程序,它将不起作用。在下面的示例中,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()
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 7

由于文档只介绍了任何小部件,

为了使按钮保持响应,您必须保留对其的引用。

因此,您需要从函数返回按钮以保留对它的引用 ( 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()
Run Code Online (Sandbox Code Playgroud)