tkinter 和 time.sleep
- 2024-12-30 08:42:00
- admin 原创
- 262
问题描述:
我试图在等待 5 秒后删除文本框内的文本,但程序却无法运行,并且会休眠。另外,有没有办法让我的文本框休眠,这样我就可以在文本冻结时运行其他代码?
from time import time, sleep
from Tkinter import *
def empty_textbox():
textbox.insert(END, 'This is a test')
sleep(5)
textbox.delete("1.0", END)
root = Tk()
frame = Frame(root, width=300, height=100)
textbox = Text(frame)
frame.pack_propagate(0)
frame.pack()
textbox.pack()
empty_textbox()
root.mainloop()
解决方案 1:
您确实应该使用类似 Tkinter after 方法而不是time.sleep(...)
。
在另一个 stackoverflow 问题中有使用 after 方法的一个例子。
以下是使用 after 方法的脚本的修改版本:
from time import time, sleep
from Tkinter import *
def empty_textbox():
textbox.delete("1.0", END)
root = Tk()
frame = Frame(root, width=300, height=100)
textbox = Text(frame)
frame.pack_propagate(0)
frame.pack()
textbox.pack()
textbox.insert(END, 'This is a test')
textbox.after(5000, empty_textbox)
root.mainloop()
解决方案 2:
您可以在 tkinter 中模拟time.sleep
。为此,我们仍然需要使用方法在 mainloop 旁边.after
运行代码,但我们可以使用函数增加代码的可读性。为了添加所需的行为,tkinter 提供了另一个被低估的功能,。停止代码块,直到设置变量,因此可以使用 进行调度。sleep
`wait_variablewait_variable
after`
def tksleep(t):
'emulating time.sleep(seconds)'
ms = int(t*1000)
root = tk._get_default_root('sleep')
var = tk.IntVar(root)
root.after(ms, var.set, 1)
root.wait_variable(var)
现实世界的例子:
更新标签以显示时钟 循环
动画编写 嵌套 for 循环
局限性:
tkinter在使用
时不会退出。tksleep
通过退出应用程序来确保没有待处理的 tksleep。
随意使用 tksleep 可能会导致意外行为
更新
TheLizzard想出了一个比上面的代码更高级的东西。他没有使用tkwait命令,而是使用了mainloop
,这解决了上面描述的不退出进程的错误,但仍可能导致意外的输出,具体取决于您的期望:
import tkinter as tk
def tksleep(self, time:float) -> None:
"""
Emulating `time.sleep(seconds)`
Created by TheLizzard, inspired by Thingamabobs
"""
self.after(int(time*1000), self.quit)
self.mainloop()
tk.Misc.tksleep = tksleep
# Example
root = tk.Tk()
root.tksleep(2)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD