与Tkinter等待一定的时间

时间:2018-08-09 10:35:39

标签: python python-2.7 tkinter

我有一个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...

谢谢。

2 个答案:

答案 0 :(得分:1)

通常,让GUI等待某些东西是一个非常糟糕的主意。这并不意味着基于事件的程序是如何工作的。或更准确地说,GUI已经处于永久等待状态,您不想自己等待就阻止它。

话虽如此,tkinter有一种方法可以等待某些事情发生。例如,您可以使用“等待”功能之一,例如wait_variablewait_windowwait_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()