注意:以下代码是在Python 3.5中编写和测试的。例如,在调用时,可能需要进行较小的更改super
。
该文档描述了该
Widget.after方法,如下所示:
after(delay_ms,callback = None,* args)
注册在给定时间后调用的警报回调。
安排功能
该
after方法主要用于在给定的延迟后安排函数调用。例如,以下代码将在一秒后安排对函数的调用:
import tkinter as tkdef speak(): print("Hello world!")root = tk.Tk()root.after(1000, speak)# OutputHello world!
使功能定期运行
为了使一个函数定期运行,可以使它在自身主体的末端进行调用。但是,
after是
Widget类中的方法,因此需要一个小部件。因此,最好的选择通常是将调度的函数放在一个类extension中
Widget。
以下代码
"Hello world!"每隔一秒钟在控制台中打印一次。
import tkinter as tkclass Foo(tk.Tk): def periodically_speak(self): print("Hello world!") self.after(2000, self.periodically_speak)foo = Foo()foo.periodically_speak()
使用参数
可能需要将参数传递给定期运行的方法。为此,该
after方法将回调后的每个参数解压缩为要传递给回调的参数。例如,
root.after(1000,foo, a, b, c)将安排对的呼叫
foo(a, b, c)。下面的示例演示如何使用此功能来确定功能的行为。
import tkinter as tkclass Foo(tk.Tk): def periodically_speak(self, text): print(text) self.after(2000, self.periodically_speak, text)foo = Foo()foo.periodically_speak("Good night world!")
取消通话
这些
after方法返回一个字符串,该字符串对应于调用的ID。可以将其传递给该
after_cancel方法,以取消已安排的呼叫。
以下示例将
"Hello world!"每秒开始打印,但是在按下按钮时将停止打印。
import tkinter as tkclass Foo(tk.Tk): def __init__(self): super().__init__() self.callId = None self.button = tk.Button(self, text="Stop", command=self.stop) self.button.pack() def periodically_speak(self): print("Hello world!") self.callId = self.after(2000, self.periodically_speak) def stop(self): if self.callId is not None: self.after_cancel(self.callId)foo = Foo()foo.periodically_speak()
旁注
请记住以下几点。
- 该
after
方法不保证在给定的延迟后将“完全”调用回调,但在回调后至少“将”调用回调。因此,after
不应在需要精度的地方使用。 time.sleep
为了计划或定期运行某个功能可能很诱人。在GUI上工作时必须避免这种情况,因为sleep
会暂停当前线程,而当前线程大部分时间都是主线程。例如,这可能会中断小部件的刷新,程序将停止响应。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)