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 交互按钮。
出于好奇,我更改了示例,将 ind
、next
和 prev
作为全局变量和函数:
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)
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 交互按钮。
出于好奇,我更改了示例,将 ind
、next
和 prev
作为全局变量和函数:
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)