我有一个Tkinter程序,我想暂停3秒。
Overlapped Views
不起作用,并且time.sleep
方法不能完全满足我的要求。
下面是示例代码:
after
输出:
from Tkinter import *
def waithere():
print "waiting..."
root = Tk()
print "1"
root.after(3000,waithere)
print "2"
root.mainloop()
我想要的输出:
1
2
*3 seconds*
waiting...
谢谢。
答案 0 :(得分:1)
通常,让GUI等待某些东西是一个非常糟糕的主意。这并不意味着基于事件的程序是如何工作的。或更准确地说,GUI已经处于永久等待状态,您不想自己等待就阻止它。
话虽如此,tkinter有一种方法可以等待某些事情发生。例如,您可以使用“等待”功能之一,例如wait_variable,wait_window或wait_visibility。
假设您希望waithere
进行等待,则可以使用wait_variable进行等待,并在给定的时间后使用after
来设置变量。
以下是基于您原始代码的解决方案:
from Tkinter import *
def waithere():
var = IntVar()
root.after(3000, var.set, 1)
print("waiting...")
root.wait_variable(var)
root = Tk()
print "1"
waithere()
print "2"
root.mainloop()
使用这些方法的优点是您的代码在等待时仍能够响应事件。
答案 1 :(得分:0)
仅供以后参考,请避免在Tkinter
中使用长循环或无限循环;它们将阻止UI响应用户事件(又称为冻结)。我所教的方法是使用after()
函数定期更新字段。
after()
函数会创建一个警报回调,意味着在调用时(使用正确的参数)它将使对目标方法的调用排队(在下面的示例中,def update(self)
中输入延迟)。在类中使用布尔值退出循环。在__init__
上创建on,然后将其设置为False
时,不再调用after()
。
这里是创建继承Tkinter.Frame的类以继承功能的示例。
try:
import tkinter as tk
except:
import Tkinter as tk
import datetime
class DelayedUpdateUI(tk.Frame):
def __init__(self, master=None, **kw):
# Create widgets, if any.
tk.Frame.__init__(self, master=master, **kw)
self.timeStr = tk.StringVar()
self.lblTime = tk.Label(self, textvariable=self.timeStr)
self.lblTime.grid()
# Call update to begin our recursive loop.
self.update()
def update(self):
self.timeStr.set(datetime.datetime.now())
# We use after( milliseconds, method_target ) to call our update
# method again after our entered delay. :)
self.after(1000, self.update)
if __name__ == '__main__':
root = tk.Tk()
DelayedUpdateUI(root).grid()
root.mainloop()