在matplotlib小部件中单击按钮时保存滑块值



与此问题类似,我想在单击按钮时保存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变量不一样,会发生什么?原因如下:

  1. 你必须把你的逻辑在set_lag函数,并做你想做的滑动条值在它。

  2. 事件函数不会返回,因为返回值在任何地方都不会被考虑。如果您查看matplotlib源代码,您会看到该函数只是被调用:

for cid, func in self.observers.items():
func(event)
  1. on_click函数返回的值只是您附加的回调函数的ID,以便您能够断开它,因此它不等于您从set_lag函数返回的lag值。

如果你需要它的值,你可以将它存储到一个全局变量或类似的东西中,但这并没有多大帮助,因为你必须在滑动条被点击时得到注意,通过你传递的事件函数。

有关更多信息,请查看"回调函数"。在python(和其他语言)中

最新更新