如何使用Tkinter after()方法?

时间:2016-06-10 12:48:41

标签: python tkinter

我在after中使用Tkinter方法时遇到问题。

计划是以1秒的间隔打印i。我检查了after方法是否合适,但我不确切知道。

这是代码。

# -*- coding: utf-8 -*-

from Tkinter import *
import time

root = Tk()
root.title("Program")
root['background'] ='gray'

def command_Print():
    for i in range(0, 10, 1):
        time.sleep(1)
        Label0.after(1)
        Labelvar.set(i)

Labelvar = StringVar()
Labelvar.set(u'original value')
Frame0 = Frame(root)
Frame0.place(x=0, y=0, width=100, height=50)
Label0 = Label(Frame0, textvariable=Labelvar, anchor='w')
Label0.pack(side=LEFT)


Frame_I = Frame(root)
Frame_I.place(x = 100, y = 0, width=100, height=70)
Button_I = Button(Frame_I, text = "Button" , width = 100, height=70, command = command_Print)
Button_I.place(x=0, y=0)
Button_I.grid(row=0, column=0, sticky=W, pady=4)
Button_I.pack()

root.mainloop()

2 个答案:

答案 0 :(得分:4)

带有单个参数的

after(例如:after(10))与调用time.sleep相同,通常应该避免。由于它使您的GUI处于休眠状态,因此您的GUI将无法响应任何事件(包括用户或操作系统刷新或调整窗口大小的请求)

当您使用两个或多个参数调用after时,第二个参数是对将来要调用的函数的引用。所有剩余的参数都将传递给该函数。

Tkinter维护一个事件队列。 mainloop是监视该队列并在事件进入时运行事件的函数。当您调用after时,您请求的函数只是添加到带有时间戳的队列中。当它准备好被处理时,tkinter将调用该函数并传入参数。就这么简单。

答案 1 :(得分:2)

在Tkinter应用程序中根本不使用time.sleep()。让回调计划使用after()调用自身。

def command_Print(counter=0):
    Labelvar.set(counter)
    if counter < 10:
        root.after(1000, lambda: command_Print(counter+1))

此外,range(0, 10, 1)只是range(10)。没有必要重复默认值。