python 3.x - standard - Tkinter, error profundidad de recursión máxima excedida
tkinter python 3 tutorial español (1)
Tengo problemas para escribir una aplicación tkinter con matplotlib que se actualice dinámicamente. Creo un diagrama y lo uso dentro de la ventana de tkinter. Luego, la trama 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 (aproximadamente un minuto) obtengo un error:
RecursionError: profundidad de recursión máxima excedida al llamar a un objeto Python
El codigo 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)
,
after
after (delay_ms, callback = None, * args)
Registra una devolución de llamada de alarma que se llama después de un tiempo determinado.