在函数内创建matplotlib小部件回调

时间:2014-08-14 12:50:44

标签: python matplotlib callback

我在Windows上使用python 2.7。 我有一个函数,它创建一个带有CheckButtons小部件的图形,它还包括按钮的回调的定义。当我调用该函数一次时,一切正常,但是当我多次调用它时,按钮停止响应,如下所示:

  • 如果使用plt.subplots()创建图形,则没有任何按钮响应。
  • 如果图是使用plt.figure()创建的,则行为不一致;有时只有第一个创建的按钮响应,有时两者都会响应。

我的猜测是,这与回调的范围有关,但我无法使用反复试验查明问题。

示例代码:

import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons

def create_button():
    plt.subplots() # or: plt.figure()
    rax = plt.axes([0.2, 0.2, 0.2, 0.2])
    check = CheckButtons(rax, ['on'], [True])
    def callback(label):
        check.labels[0].set_text('on' if check.lines[0][0].get_visible() else 'off')
        plt.draw()
    check.on_clicked(callback)

create_button()
#create_button() # uncomment to reproduce problem
plt.show() 

2 个答案:

答案 0 :(得分:2)

事实证明问题是函数返回后在函数内创建的CheckButtons实例不再存在。

我想出的解决方案是在调用函数的范围内保留一个列表(我在类中使用了一个静态变量),并将该实例从函数中追加到此列表中。这样,当函数退出时,CheckButtons实例仍然存在。为了使该列表不会超过需要,我还编写了一个从列表中删除相应实例的函数,并将此函数注册为用户关闭图形事件的回调。

如果存在这样的解决方案,我将很高兴听到有关我的解决方案的评论或更多Python解决方案的建议。

答案 1 :(得分:1)

我认为如果你在函数结尾处return check,这将有助于在退出时保持按钮处于活动状态。