2016-01-01 291 views
0

如何保持在while (True):循环更新tkinter帆布,什么样的?如何使用Tkinter持续刷新画布?

我知道,你可以做after(1000 , refresh_function);,但如何使循环重复下去吗?

实例:绘制具有固定长度的线的角度,并将该角度不断增加(因此该线旋转/旋转)的程序。

我想我已经查看了这里所有相关的问题,但是这可能仍然是一个重复的,如果是,我很抱歉。

+0

root.update()? – Unknown

+0

我只是瞪着它,谢谢,那正是我需要的:) –

+0

所以我会为它添加一个答案;) – Unknown

回答

-1

要更新使用TKinter窗口(用帆布等),你需要root.mainloop(),相当于在:

while 1: 
    root.update() 
+0

噢好吧。我在google上找到了关于update()的信息,但是你的回答更加清晰。我认为mainloop()实际上是让窗口保持活动状态,并且在调用mainloop之前窗口不存在。愚蠢。谢了哥们! –

+0

这是一个不好的做法。虽然技术上它可以工作,但这不是一个特别好的解决方案。您的GUI不会像其他解决方案那样顺畅地响应事件。 –

0

也许类threading.Timer可以帮助你

def f(): 
    # write our code for repainting canvas 
    # call f() again in 60 seconds 
    threading.Timer(60, f).start() 
# start calling f now and then every 60 sec 
f() 
+0

哈哈,我真是个笨蛋。我试着这样做: '高清_my_mainloop(个体经营): #CODE self.after(60 self._my_mainloop)' ,我只是得到了一个堆栈溢出。 感谢您的回答! –

+0

我提出线程,以避免“而真正的”循环可能导致GUI冻结..欢迎您 –

3

一个while True:环路与使用.mainloop()不兼容。您可以通过在退出之前重新调度自己来重复某个功能。其他答案中有几个例子,比如让一些东西在画布上滑行。这是另一个说明这个想法的例子。

import tkinter as tk 

root = tk.Tk() 
text = tk.StringVar(root) 
label = tk.Label(root, textvariable=text) 
label.pack() 

def add_a(): 
    text.set(text.get()+'a') 
    root.after(500, add_a) # <== re-schedule add_a 

root.after(500, add_a) # <== start the repeating process 
root.mainloop() 
+0

我发现我在我的执行结束时得到一个错误,当我用,而真正的:...这是一个令人钦佩的方法。我很喜欢!谢谢。 –