2017-02-21 32 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() 

Любая помощь по решению этой проблемы или просто общие советы 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