Tkinter, se excedió la profundidad de recursión máxima de error

Tengo problemas para escribir una aplicación tkinter con matplotlib que se actualiza dinámicamente. Creo un diagtwig y lo uso dentro de la ventana del tkinter. Luego, la ttwig se actualiza cada 50 ms con un método tk.after (), que funciona bien en otras aplicaciones que he probado hasta ahora. Pero en mi aplicación todo parece estar funcionando hasta después de un tiempo (un minuto más o menos) me aparece un error:

RecursionError: profundidad de recursión máxima excedida al llamar a un objeto de Python

El código es:

import matplotlib #matplotlib.use('TkAgg') from numpy import arange, sin, pi from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg # implement the default mpl key bindings from matplotlib.backend_bases import key_press_handler from matplotlib.figure import Figure import sys import time if sys.version_info[0] < 3: import Tkinter as Tk else: import tkinter as Tk import numpy as np import matplotlib.pyplot as plt import math class MainWindow(): #---------------- def __init__(self, root): self.index=0 self.root=root self.fig, self.ax = plt.subplots() self.line, = self.ax.plot(np.random.randn(100)) #plt.show(block=False) # a tk.DrawingArea self.canvas = FigureCanvasTkAgg(self.fig, master=root) self.canvas.show() self.canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) self.toolbar = NavigationToolbar2TkAgg(self.canvas, root) self.toolbar.update() self.canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) self.canvas.mpl_connect('key_press_event', self.on_key_event) self.display = Tk.Label(root, text="") # we need this Label as a variable! self.display.pack() self.button1 = Tk.Button(master=root, text='Quit', command=self._quit) self.button1.pack(side=Tk.BOTTOM) global w w=2*math.pi self.button2 = Tk.Button(master=root, text='Increase frecuency', command=self.button2_event) self.button2.pack(side=Tk.BOTTOM) #A simple clock global miliseconds global t t=time.time() self.update_clock() print('going to the next stop') self.root.mainloop() def on_key_event(event): print('you pressed %s' % event.key) key_press_handler(event, self.canvas, toolbar) def _quit(self): self.root.quit() # stops mainloop self.root.destroy() # this is necessary on Windows to prevent # Fatal Python Error: PyEval_RestoreThread: NULL tstate def button2_event(self): global t global w w+=2*3.1416 def update_clock(self): global t mili=str(math.floor(1000*(t-time.time())))+' ms' t=time.time() now = time.strftime("%H:%M:%S"+'-'+mili) self.display.configure(text=now) N=100 y=np.sin(4*math.pi*(np.array(range(N))/N)+t*w) x=range(N) self.line.set_ydata(y) self.line.set_xdata(x) self.ax.relim() self.ax.autoscale() #☺fig.canvas.update() #fig.canvas.flush_events() self.canvas.show() self.canvas.flush_events() self.root.after(50, self.update_clock()) #<------ERROR HERE!------ root = Tk.Tk() root.wm_title("Embedding in TK") MainWindow(root) 

Cambie self.root.after(50, self.update_clock()) a self.root.after(50, self.update_clock) , después de

after (delay_ms, callback = None, * args)

Registra una callback de alarma que se llama después de un tiempo determinado.