【发布时间】:2021-06-30 09:48:17
【问题描述】:
我正在尝试使用 ginput 来注册地图上的点击,并希望使用 matplotlib 小部件添加操作按钮。在下面的代码中,我可以通过将 action 的值声明为 global 将其传递回主代码。如果我点击地图,action=0,如果我点击按钮,action=1,根据需要。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
class Index:
def test(self, event):
global action
action=1
# fake data
x=np.arange(30)
y=x**2
fig,ax=plt.subplots()
ax.plot(x,y)
callback = Index()
buttonname=['test']
colors=['white']
idx=[0.2]
bax,buttons={},{}
# set up list of buttons.
for i,col,button in zip(idx,colors,buttonname):
bax[button] = plt.axes([0.92, i, 0.07, 0.07])
buttons[button] = Button(bax[button],button,color=col,hovercolor='green')
buttons[button].on_clicked(getattr(callback,button))
# register click on plot
while True:
pts=plt.ginput(1)
plt.pause(0.5)
print("action is ",action)
action=0 # reset
但我的困惑是,如果我采用完全相同的代码并将其放在 def 块中,则不再将 action 的值传回,action 始终为零。
def subtest():
class Index:
def test(self, event):
global action
action=1
# fake data
action=0
x=np.arange(30)
y=x**2
fig,ax=plt.subplots()
ax.plot(x,y)
callback = Index()
buttonname=['test']
colors=['white']
idx=[0.2]
bax,buttons={},{}
# set up list of buttons.
for i,col,button in zip(idx,colors,buttonname):
bax[button] = plt.axes([0.92, i, 0.07, 0.07])
buttons[button] = Button(bax[button],button,color=col,hovercolor='green')
buttons[button].on_clicked(getattr(callback,button))
# register click on plot
while True:
pts=plt.ginput(1)
plt.pause(0.5)
print("action is ",action)
action=0 # reset
res=subtest()
我很困惑为什么会发生这种情况。我尝试将类定义移到主代码中,但这没有帮助。我对任何类型的解决方案都感到高兴(例如,通过参数传递动作,我不明白如何处理小部件),因为我认为global 的使用经常被皱眉。但也可以使用基于 global 的解决方案。
【问题讨论】:
-
您在
subtest.Index.test范围内将action声明为global,但不在subtest范围内。
标签: python matplotlib matplotlib-widget ginput