2013-08-12 3 views
1

Я использую объекты таймера matplotlib для регистрации моей собственной функции обновления для анимации. Кажется, я не могу остановить обратные вызовы после их запуска, не сохраняя ссылки на объект таймера.Где таймеры живут в 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.

ответ

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) 

, и именно поэтому каждый пример показывает сохранение собственной ссылки на таймер

+0

Я понимаю что нетрудно сохранить ссылку на объект сам. Я ищу лучшего понимания matplotlib больше, чем быстрое решение. Я знаю, что ссылка скрыта где-то, потому что она продолжает называться, но я не мог найти ее в любом месте, я смотрел – Hammer

+0

там, я немного разработал –

+0

спасибо, это было очень полезно – Hammer

Смежные вопросы