<p>您得到无限递归,因为当您在<code>update()</code>函数中调用<code>svlsr.set_val</code>时,它会通知在<code>svlsr</code>上注册的任何观察者。对于任何感兴趣的人,执行此操作的代码是<a href="https://github.com/matplotlib/matplotlib/blob/v1.4.3/lib/matplotlib/widgets.py#L432" rel="nofollow">here</a>。在</p>
<p>observer是您在调用<code>svlsr.on_changed</code>中指定的函数,它是。。。<code>update()</code>又来了。因此,<code>update()</code>将再次被调用,它将再次调用<code>set_val()</code>,然后再次调用{<cd2>},依此类推。。。在</p>
<h3>简单情况下</h3>
<p>根据您的代码,顶部滑块(<code>sreds</code>)会更改底部滑块(<code>svlsr</code>)上的值,但反之亦然。如果是这样,那么解决方案就相对容易了。您可以有一个函数来处理<code>sreds</code>(例如<code>updatesreds()</code>),它可能与当前的<code>update()</code>完全相同,而另一个函数(例如<code>updatesvlsr()</code>)在底部滑块更新时做任何你想做的事情。除非您希望在<code>svlsr</code>中对<code>set_val()</code>调用<code>sreds</code>上的<code>set_val()</code>,否则这将有效<strong><em>。在</p>
<p>代码如下所示(替换示例中的第33行):</p>
<pre><code>def updatereds(val):
global d0, z0
delt = svlsr.val/c
z = sreds.val
if z!=0.0:
if z != z0:
delt = z
svlsr.set_val(z*c) #set_val causes infinite loop??
d0 = delt
z0 = z
fac = 1.0 + delt
l.set_xdata(t*fac)
fig.canvas.draw_idle()
def updatesvlsr(val):
# put any code you need to execute on direct update to svlsr here
# the only thing you can't do is set_val on sreds, otherwise again
# you will infinitely recurse
pass
svlsr.on_changed(updatesvlsr)
sreds.on_changed(updatereds)
</code></pre>