2017-02-27 28 views
1

dinamicalyを更新するmatplotlibでtkinterアプリケーションを書き込む際に問題があります。私はプロットを作成し、それをtkinterウィンドウ内で使用します。プロットは50msごとにtk.after()メソッドで更新されます。これは今までtryした他のアプリケーションでうまくいきます。Tkinter、エラー最大再帰深度を超えました

RecursionError:コードが

Pythonオブジェクトを呼び出している間、最大再帰の深さを超えていくつかの時間(分程度)した後、私はエラーを取得するまで、しかし、私のアプリケーションですべてが動作しているようですself.root.after(50, self.update_clock)

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) 
+1

'self.root.after(50、self.update_clock())'を 'self.root.after(50、self.update_clock)'に変更する ' – eyllanesc

+0

は今、すごくうれしく思います! – Victor

+0

私がここに書いたのは、それを返信しました。それを正しいものとしてマークしてください。 – eyllanesc

答えて

3

変更self.root.after(50, self.update_clock())after

after(delay_ms, callback=None, *args)

Registers an alarm callback that is called after a given time.

関連する問題