当前位置: 首页 > 面试题库 >

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

林英武
2023-03-14
问题内容

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

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

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

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


问题答案:

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

该文档描述了该Widget.after方法,如下所示:

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!

使功能定期运行

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


 类似资料:
  • 使用tkinter,如何使用方法定期运行函数? 例如,我有一个只在控制台中打印内容的函数: 如何使用方法每秒调用函数?

  • 我有一个方法希望使用Spring运行一次,它需要在给定的(或)。我计划将该方法应该执行的所有日期持久化到数据源。它应该异步运行。 一种方法是每天检查数据库中的日期,如果日期已过且尚未执行,则执行该方法。有没有更好的方法? 我知道Spring提供了和。我正在查看界面中的。我需要创建Spring托管bean来调用我的方法吗?或者有更简单的注释可以做到这一点吗?举个例子真的很有帮助。 (也看了这里。)

  • 我正在尝试使用jersey 2/HK2自动绑定带有特定注释的工厂类。因此,我在运行时从泛型接口获取所提供的类型,然后尝试将工厂绑定到此类型。将工厂绑定到类的方法如下所示: HK2提供的方法定义如下: 当我用Eclipse构建所有东西时,这似乎工作得很好。然而,当我使用maven构建项目时,我会得到以下构建错误:

  • 问题内容: 有谁知道如何使用javascript调用服务器端c#方法?我需要做的是如果选择“取消”则停止导入,或者如果选择“确定”则继续导入。我正在使用Visual Studio 2010和C#作为编程语言 这是我的代码: 问题答案: PageMethod是Asp.Net AJAX的一种更轻松,更快速的方法。通过释放AJAX的功能,我们可以轻松地改善用户体验和Web应用程序的性能。我最喜欢AJAX

  • 问题内容: 我有两个AsyncTasks在做网络操作。我想定期给他们打电话(例如一分钟后)。我怎么做?我不认为我可以在UI线程上做到这一点。我需要创建一个新线程吗?没有AlarmManager / Service,是否可以实现? 基本上,我想在一分钟后定期执行这两个语句。 谢谢 问题答案: 只需使用一个计时器。

  • 问题内容: 我正在使用Mockito测试旧版JAAS / LDAP登录模块。 该接口定义了以下功能: 我期望包含一个,这是需要进行操作才能通过测试的对象。 有没有一种方法可以有效地对此进行模拟,或者我可以通过实施存根实现更好呢? 问题答案: 对于返回的函数,请使用doAnswer() 和执行拦截必须在作为参数,例如,作为一个匿名类: 在这种情况下将是数组!