2017-02-21 6 views
0

Wenn ich versuche, meinen Code auszuführen, wird alles ausgeführt, aber die After-Function-Aufrufe werden sofort aktualisiert, trotz der 5 Sekunden Verzögerung, die ich eingefügt habe. Darüber hinaus zeigt die GUI kein Diagramm .tkinter .after() Funktion pausiert nicht

import tkinter as tk 
import numpy as np 
import time 
import functools 

import matplotlib 
matplotlib.use("TkAgg") 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 

main = tk.Tk() 
container = tk.Frame(main) 
container.pack(side="top", fill="both", expand = True) 
container.grid_rowconfigure(0, weight=1) 
container.grid_columnconfigure(0, weight=1) 

f = Figure(figsize=(5,5), dpi=100) 
a = f.add_subplot(111) 
canvas = FigureCanvasTkAgg(f, master=main) 
canvas.show() 
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True) 

def update(a, canvas): 
     data = np.genfromtxt('test.csv', delimiter=',', names=['x', 'y']) 
     a.clear() 
     a.plot(data['x'], data['y'], color='r', label='the data') 


     canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True) 

     print ("update") 
     main.after(5000, functools.partial(update, a)(canvas)) 

main.after(5000, functools.partial(update, a)(canvas)) 
main.mainloop() 

Jede Hilfe zur Lösung dieses Problems oder nur allgemeine Python Tipps würden sehr geschätzt werden.

+0

Warum haben Sie importzeit verwendet? Time.sleep funktioniert nicht in tkinter. – Jake

+0

Ich benutzte das nur zum Debuggen und vergaß es zu entfernen. – user3517818

Antwort

1

diese Codezeile vor:

main.after(5000, functools.partial(update, a)(canvas)) 

Es ist genau so, wie dies das gleiche tun:

func = functools.partial(update, a) 
result = func(canvas) 
main.after(5000, result) 

Damit after seine Arbeit tun Sie ihm eine Referenz geben muss zu der Funktion, die aufgerufen werden soll. In Ihrem Code rufen Sie ihn sofort an und geben das Ergebnis an after weiter.

Da Sie Positionsargumente zu after, die weitergegeben wird erhalten auf Ihren Befehl liefern kann, können Sie umschreiben Ihre after wie folgt aus:

main.after(5000, functools.partial(update, a), canvas) 

Obwohl, ich sehe nicht ganz, warum Sie Sie functools.partial müssen denken . Sie sollten in der Lage sein, es auf diese zu kondensieren:

+0

Vielen Dank für Ihre Antwort. Ich habe deine Änderungen implementiert und sie haben sehr gut funktioniert. Die GUI wird noch nicht aktualisiert, aber danach scheint sie sehr gut zu funktionieren. Danke noch einmal. – user3517818

Verwandte Themen