与此问题类似,我想在单击按钮时保存matplotlib滑块的值。使用print()将值打印到控制台很容易,但是我不知道如何将其保存为变量。这是我尝试过的,但是它在用户做任何事情之前返回一个零值。
def myFunction():
fig, ax = plt.subplots()
ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
lag_slider = Slider(ax=ax_slider, label='lag (s)', valmin=-15, valmax=15, valinit=0)
def update(val):
lag = lag_slider.val
lag_slider.on_changed(update)
button_ax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(button_ax, 'Set Lag')
def set_lag(val):
lag = lag_slider.val
print(lag) # this prints the lag value to the console, I want to return it from the function
return lag
lag = button.on_clicked(set_lag)
return lag # this executes before the button is clicked
当你将一个函数传递给on_clicked
时,这个函数还没有执行,当你点击你正在使用on_clicked
的小部件时,它就会运行。
这是调用函数(如set_lag()
)或仅仅传递函数(如set_lag
)之间的区别(注意括号)。实际上在on_clicked
函数的源代码中,它是这样命名这个函数的:
func(event)
在这个流程中,您的set_lag
将被执行。
如果可以输出值,但是返回的lag
变量不一样,会发生什么?原因如下:
你必须把你的逻辑在
set_lag
函数,并做你想做的滑动条值在它。事件函数不会返回,因为返回值在任何地方都不会被考虑。如果您查看matplotlib源代码,您会看到该函数只是被调用:
for cid, func in self.observers.items():
func(event)
on_click
函数返回的值只是您附加的回调函数的ID,以便您能够断开它,因此它不等于您从set_lag
函数返回的lag
值。
如果你需要它的值,你可以将它存储到一个全局变量或类似的东西中,但这并没有多大帮助,因为你必须在滑动条被点击时得到注意,通过你传递的事件函数。
有关更多信息,请查看"回调函数"。在python(和其他语言)中