matplotlib ( python) - 在点击事件中更改全局变量

matplotlib ( python) - change global varible in click event

matplotlib - 在点击事件中更改全局变量。

嘿,我花了太多时间来解决这个问题,现在一无所获。 我试过这段代码:

def menu_event(event):
    global state
    state +=1
    print(state)

def main():
    ...
    b = Button(button_ax, name, color=color, hovercolor=font_color)
    b.on_clicked(menu_event)
    ...
    while True:
        print(state)
    

state = 0
if __name__ == "__main__":
    main()

并且状态变量没有改变! 我在输出中得到的内容如下:

0
0
0
1 # A push of a button happened
0
0
0
2 # A push of a button happened
0
0
0
3 # A push of a button happened
0
0

...

所以它使“状态”像 menu_event(event) 的静态变量。 我做错了什么?感谢您的帮助!

Matplotlib 的文档有一个 nice example code 用于 defining/using 交互按钮。

出于好奇,我更改了示例,将 indnextprev 作为全局变量和函数:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

freqs = np.arange(2, 20, 3)

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
t = np.arange(0.0, 1.0, 0.001)
s = np.sin(2*np.pi*freqs[0]*t)
l, = plt.plot(t, s, lw=2)

def next(event):
    global ind
    ind += 1
    i = ind % len(freqs)
    ydata = np.sin(2*np.pi*freqs[i]*t)
    l.set_ydata(ydata)
    plt.draw()

def prev(event):
    global ind
    ind -= 1
    i = ind % len(freqs)
    ydata = np.sin(2*np.pi*freqs[i]*t)
    l.set_ydata(ydata)
    plt.draw()


ind = 0

def main():
    axprev = plt.axes([0.7, 0.05, 0.1, 0.075])
    axnext = plt.axes([0.81, 0.05, 0.1, 0.075])
    bnext = Button(axnext, 'Next')
    bnext.on_clicked(next)
    bprev = Button(axprev, 'Previous')
    bprev.on_clicked(prev)
    plt.show()

if __name__ == "__main__":
    main()

它像原始代码一样工作。

因此使用全局变量是一种选择,但是定义 state 变量以及在单个 class 中修改它的函数是您应该考虑的更好方法。

例如:


class State(object):

    def __init__(self):
        self._state = 0
        ...

    def click_event(self, event):
        self._state += 1
        ...
        plt.draw()

state = State()
b = Button(button_ax, name, color=color, hovercolor=font_color)
b.on_clicked(state.click_event)