我正在使用matplotlib计时器对象为动画注册我自己的更新功能。我似乎无法在没有保留对计时器对象的引用的情况下停止回调。
到目前为止,我的经验是,当我在matplotlib中创建一个对象时,我会给它一个引用,但它也被添加到一个其他对象内的列表中(图中的轴,轴中的线等),这可以然后再被查询。但我找不到计时器对象的位置。我的问题可以通过此代码段总结
import matplotlib.pyplot as plt
import numpy as np
def update():
plt.get_current_fig_manager().canvas.figure.patch.set_facecolor(str(np.random.random()))
plt.draw()
def start_animation():
timer = fig.canvas.new_timer(interval = 50)
timer.add_callback(update)
timer.start()
fig = plt.figure()
start_animation()
运行上面的代码段,然后尝试以编程方式停止闪烁。需要调用的函数是
timer.remove_callback(update).
要清楚。我知道我可以保留对计时器对象的引用,这个问题就消失了。我正在寻找这个对象必须在matplotlib中生活的地方的解释。
答案 0 :(得分:1)
怎么回合
self.timer = fig.canvas.new_timer(interval=100)
...
self.timer.remove_callback(...)
澄清参考是在callafter方法。 您的图形或画布中没有存储参考 你可以在后端源中看到这个
def new_timer(self, *args, **kwargs):
"""
Creates a new backend-specific subclass of :class:`backend_bases.Timer`.
This is useful for getting periodic events through the backend's native
event loop. Implemented only for backends with GUIs.
optional arguments:
*interval*
Timer interval in milliseconds
*callbacks*
Sequence of (func, args, kwargs) where func(*args, **kwargs) will
be executed by the timer every *interval*.
"""
return TimerTk(self._tkcanvas, *args, **kwargs)
只返回一个TimerTK实例。引用继续存在,因为在TimerTk.start()
方法中你看到一个继续保持计时器不被垃圾收集的callafter
class TimerTK(TimerBase):
...
def _timer_start(self):
self._timer_stop()
self._timer = self.parent.after(self._interval, self._on_timer)
这就是为什么每个例子都显示保存自己对计时器的引用