使用tkinter,如何使用after
方法定期运行函数?
例如,我有一个speak
函数,只在控制台中打印一些东西:
def speak():
print("Hello, world!")
如何使用after
方法每秒调用speak
函数?
答案 0 :(得分:3)
注意:以下代码是在Python 3.5中编写和测试的。可能需要进行细微更改,例如,在调用super
。
documentation描述了Widget.after
方法,如下所示:
之后(delay_ms,callback = None,* args)
注册在给定时间后调用的警报回调。
安排功能
after
方法主要用于在给定延迟后调度函数调用。例如,以下代码在一秒钟后调度对函数的调用:
import tkinter as tk
def speak():
print("Hello world!")
root = tk.Tk()
root.after(1000, speak)
# Output
Hello world!
定期运行功能
为了使函数定期运行,可以让它在自己的主体末尾调用自身。但是,after
是来自Widget
类的方法,因此需要一个小部件。因此,最好的选择通常是将调度函数放在扩展Widget
的类中。
以下代码在控制台中每隔一秒打印一次"Hello world!"
。
import tkinter as tk
class 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 tk
class 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 tk
class 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`会暂停当前线程,大部分时间都是主线程。例如,这可能会停止刷新小部件,程序将停止响应。