当前位置: 首页 > 知识库问答 >
问题:

如何使用after方法定期运行回调?

曹经业
2023-03-14

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

例如,我有一个只在控制台中打印内容的函数:

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

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

共有1个答案

澹台欣怿
2023-03-14

注意:以下代码是用Python3.5编写和测试的。例如,在调用super时,可能需要进行一些小的更改。

留档描述Widget.after方法如下:

后(delay_ms,回调=无,*args)

注册在给定时间后调用的报警回调。

调度函数

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

import tkinter as tk

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

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

# Output
Hello world!

使函数定期运行

为了使函数周期性地运行,可以让它在自己的主体末尾调用自己。但是,after是来自Widget类的方法,因此需要一个Widget。因此,最好的选择通常是将调度函数放在扩展小部件的类中。

下面的代码打印“你好,世界!” 在控制台中每隔一秒钟。

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!")

取消电话

方法之后的返回一个字符串,该字符串对应于调用的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()

旁注

应记住以下几点。

  • 之后的方法并不能保证在给定的延迟之后调用回调,而是在它之后调用。因此,之后的不应该用于需要精度的地方。
  • 使用time.sleep来调度或定期运行函数可能很有诱惑力。在GUI上工作时必须避免这种情况,因为“睡眠”会暂停当前线程,而当前线程大部分时间是主线程。例如,这可能会停止小部件的刷新,程序将停止响应。

 类似资料:
  • 问题内容: 使用tkinter,如何使用该方法使函数定期运行? 例如,我有一个仅在控制台中打印内容的函数: 如何使用该方法每秒调用一次函数? 问题答案: 注意:以下代码是在Python 3.5中编写和测试的。例如,在调用时,可能需要进行较小的更改。 该文档描述了该方法,如下所示: after(delay_ms,callback = None,* args) 注册在给定时间后调用的警报回调。 安排功

  • 如果可以在该代码中运行onCreate方法,我认为应该有类似的代码

  • 问题内容: 我奋力奔跑名为单个测试方法在文件中使用。我尝试了以下组合: 在每种情况下, 都将执行文件中的 所有 测试方法。如何只选择一种方法呢? 该类的名称为,版本为3.2.8。 问题答案: 以下命令在单个方法上运行测试: 对于新版本的phpunit,它只是:

  • 我正在努力运行一个名为的测试方法,该方法位于文件中。我尝试了以下组合: 在每种情况下,都会执行文件中的所有测试方法。如何只选择一种方法? 该类的名称为,的版本为3.2.8。

  • 问题内容: 我从迁移到了,我找不到等效的。(A有两个参数:要运行的函数和两次调用之间的毫秒数。) 有这样的等同物吗? 如果没有,那么在没有冒一会儿风险的情况下实现此目标的最干净方法是什么? 问题答案: 对于3.5以下的Python版本: 对于Python 3.5及更高版本:

  • 我想定期运行代码在django为此我下载了芹菜并试图配置它 添加到设置中。派克 他做了一个芹菜。py文件 创建了一个任务。py文件 依次发射了一切 节拍带给我的 芹菜。0.5(奇点)正在启动本地时间- 但工人每15秒就扔下一个 [2021-02-19 16:18:02,275:警告/SpawnPoolWorker-1]c:\用户\admin\appdata\本地\程序\python\python3