tkinter:如何使用 after 方法
- 2024-11-27 10:43:00
- admin 原创
- 11
问题描述:
嘿,我是 Python 新手,正在使用 tkinter 作为我的 GUI。我在使用该frame.after
方法时遇到了麻烦。
目标是每 5 秒出现一个随机字母。
这是我的代码:
import random
import time
from tkinter import *
root = Tk()
w = Label(root, text="GAME")
w.pack()
frame = Frame(root, width=300, height=300)
frame.pack()
L1 = Label(root, text="User Name")
L1.pack(side=LEFT)
E1 = Entry(root, bd =5)
E1.pack(side=LEFT)
tiles_letter = ['a', 'b', 'c', 'd', 'e']
while len(tiles_letter) > 0:
rand = random.choice(tiles_letter)
tile_frame = Label(frame, text=rand)
tile_frame.pack()
frame.after(500)
tiles_letter.remove(rand) # remove that tile from list of tiles
root.mainloop()
有人能帮帮我吗?
问题肯定是frame.after(500)
,我不确定使用是否正确frame
,也不知道参数后面跟着哪个参数500
。
谢谢
解决方案 1:
您需要提供一个在时间延迟后调用的函数作为第二个参数after
:
after(delay_ms, callback=None, *args)
注册一个在给定时间后调用的警报回调。
所以你真正想要做的是这样的:
tiles_letter = ['a', 'b', 'c', 'd', 'e']
def add_letter():
rand = random.choice(tiles_letter)
tile_frame = Label(frame, text=rand)
tile_frame.pack()
root.after(500, add_letter)
tiles_letter.remove(rand) # remove that tile from list of tiles
root.after(0, add_letter) # add_letter will run as soon as the mainloop starts.
root.mainloop()
after
您还需要通过在回调函数内部重复调用来安排再次调用该函数,因为after
只执行一次给定的函数。文档中也提到了这一点:
每次调用此方法时,回调只会调用一次。要继续调用回调,您需要在其内部重新注册回调
请注意,一旦用尽了 中的所有条目,您的示例就会抛出异常tiles_letter
,因此您需要更改逻辑以按照您想要的方式处理这种情况。最简单的方法是在 的开头添加一个检查,add_letter
以确保列表不为空,并且仅return
在列表为空时才执行:
def add_letter():
if not tiles_letter:
return
rand = random.choice(tiles_letter)
tile_frame = Label(frame, text=rand)
tile_frame.pack()
root.after(500, add_letter)
tiles_letter.remove(rand) # remove that tile from list of tiles
现场演示:repl.it
解决方案 2:
我相信,500ms 在后台运行,而其余代码继续执行并清空列表。
然后 500 毫秒后什么也不会发生,因为在调用后没有实现任何函数调用(与 相同frame.after(500, function=None)
)
解决方案 3:
after
用于延迟执行程序或在将来的某个时间在后台执行命令。但您可以通过调用主循环本身在主循环内构建循环。
import tkinter as tk #import tkinter
import datetime #import datetime for our clock
def tick(): #function to update the clock
showed_time = clock['text'] #current showed time
current_time = datetime.datetime.now().strftime("%H:%M:%S") #real time
if showed_time != current_time: #if the showed time is not the real time
clock.configure(text=current_time) #update the label with the current time
clock.after(1000, tick) #call yourself in 1000ms (1sec.) again to update the clock
return None
root=tk.Tk()
clock = tk.Label(root)
clock.pack()
tick()
root.mainloop()
在上面的脚本中,我们创建了一个数字时钟,并与 after 方法建立联系。after 方法只是一个间隔,我们希望在该间隔结束时发生一些事情。
要了解有关此基本小部件方法的更多信息,请[单击]
之后(delay_ms,回调=无,参数)
此方法注册一个回调函数 ,该函数将在给定的毫秒数后调用。Tkinter仅保证 回调不会早于该时间被调用;如果系统繁忙,实际延迟可能会更长。
import tkinter as tk
import datetime
def tick():
showed_time = clock['text']
current_time = datetime.datetime.now().strftime("%H:%M:%S")
if showed_time != current_time:
clock.configure(text=current_time)
global alarm #make sure the alarm is reachable
alarm = clock.after(1000, tick)#assign the alarm to a variable
return None
def stop():
stop.after_cancel(alarm) #cancel alarm
root=tk.Tk()
clock = tk.Label(root)
clock.pack()
stop = tk.Button(root, text='Stop it!', command=stop)
stop.pack()
tick()
root.mainloop()
这里我们有相同的代码,但可以使用tkinter 的方法取消循环。您不需要在类内全局化警报。工作正常。after_cancel
`self.alarm = self.clock.after(...)`
after_cancel(id)
取消闹钟回拨。
ID
报警标识符。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件