使用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!
使功能定期运行
为了使一个函数定期运行,可以使它在自身主体的末端进行调用。但是,after
是Widget
类中的方法,因此需要一个小部件。因此,最好的选择通常是将调度的函数放在一个类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() 和执行拦截必须在作为参数,例如,作为一个匿名类: 在这种情况下将是数组!