gpt4 book ai didi

python - 如何使用after方法让回调周期性运行?

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:49 27 4
gpt4 key购买 nike

在 tkinter 中,如何使用 after 方法使函数定期运行?

例如,我有一个 speak 函数,它只在控制台打印一些东西:

def speak():
print("Hello, world!")

如何使用 after 方法每秒调用 speak 函数?

最佳答案

注意:以下代码是在 Python 3.5 中编写和测试的。例如,在调用 super 时可能需要进行微小的更改。

documentation Widget.after方法描述如下:

after(delay_ms, callback=None, *args)

Registers an alarm callback that is called after a given time.


安排一个函数

after 方法主要用于在给定延迟后安排函数调用。例如,以下代码安排在一秒后调用一个函数:

import tkinter as tk

def speak():
print("Hello world!")

root = tk.Tk()
root.after(1000, speak)

# Output
Hello world!

使函数定期运行

为了让一个函数周期性地运行,可以让它在它自己的函数体的末尾调用它自己。但是,afterWidget 类中的一个方法,因此需要一个小部件。因此,最好的选择通常是将调度函数放在扩展 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` 会暂停当前线程,大部分时间是主线程。例如,这可能会停止小部件的刷新,程序将停止响应。

关于python - 如何使用after方法让回调周期性运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44085554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com