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

时间:2017-05-20 11:53:55

标签: python tkinter

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

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

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

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

1 个答案:

答案 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`会暂停当前线程,大部分时间都是主线程。例如,这可能会停止刷新小部件,程序将停止响应。