2017-02-21 1 views
0

내 코드를 실행하려고하면 모든 코드가 실행되지만 after 함수는 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() 

이 문제를 해결하는 데 도움이되었거나 일반적인 파이썬 팁에 대한 도움을 주시면 감사하겠습니다.

+0

왜 가져온 시간을 사용 했습니까? Time.sleep은 tkinter에서 작동하지 않습니다. – Jake

+0

난 그냥 디버깅을 위해 그것을 사용하고 그것을 제거하는 것을 잊었습니다. – user3517818

답변

1

코드 행 고려 :

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

그것은이 정확히 같은 일을하고됩니다 :

당신이 그것을 참조를 제공해야 그 일을 수행하는 after 위해서는
func = functools.partial(update, a) 
result = func(canvas) 
main.after(5000, result) 

호출 할 함수에 전달한다. 코드에서 실제로 호출 한 다음 after에 결과를 전달합니다.

당신이 당신의 명령에 전달 얻을 것이다 after에 위치 인수를 제공 할 수 있기 때문에, 당신은 다시 쓸 수있는이 같은 after : 당신은 당신이 functools.partial 필요하다고 생각하는 이유

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

비록, 내가 확실히 표시되지 않습니다 . 다음과 같이 응축 할 수 있어야합니다.

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

답변 해 주셔서 감사합니다. 나는 당신의 변화를 구현했고 그것들은 잘 작동했다. gui 여전히 업데이 트되지 않습니다하지만 이후 잘 작동하는 것 같다. 다시 한번 감사드립니다. – user3517818

관련 문제