【问题标题】:How to use Tkinter after() method?如何使用 Tkinter after() 方法?
【发布时间】:2016-06-10 12:48:40
【问题描述】:

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

计划以一秒的间隔打印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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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)。无需重复默认设置。

      【讨论】:

      • 在这种特定情况下,您不需要 lambda。你可以做root.after(1000, command_Print, counter+1),我认为这更容易阅读。很多人在摸索lambda时遇到问题。
      猜你喜欢
      • 2014-11-03
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 2017-08-19
      • 2021-05-03
      • 1970-01-01
      • 2021-02-16
      相关资源
      最近更新 更多