2017-02-21 153 views
0

當我嘗試運行我的代碼時,一切都會執行,但after函數會立即調用update,儘管我放入了5秒的延遲。在此之上,gui沒有顯示任何圖。tkinter.after()函數沒有暫停

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() 

任何幫助解決這個問題或只是一般的Python技巧將不勝感激。

+0

你爲什麼使用導入時間? Time.sleep在tkinter中不起作用。 – Jake

+0

我只是用它進行調試,忘記刪除它。 – user3517818

回答

1

考慮這行代碼:

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

這是做同樣的事情,因爲這:

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

爲了after做它的工作,你必須給它一個參考到要調用的函數。在你的代碼中,你實際上是立即調用它,然後將結果傳遞給after

既然你可以提供位置參數來after將得到傳遞給你的命令,你可以重寫你的after這樣的:

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

雖然,我不太明白爲什麼你認爲你需要functools.partial 。你應該能夠將它凝結到這:

main.after(5000, update, a, canvas) 
+0

非常感謝您的回覆。我實施了你的改變,他們工作得很好。 gui沒有更新,但後來似乎工作得很好。再次感謝。 – user3517818