python - Tkinter 忽略 root.after 延迟
问题描述
Tkinter 忽略root.after
倒计时动画播放,但它忽略延迟并root.after
在倒计时结束之前执行所有操作
所有测试都表明倒计时正在发生并且变量正在发生变化,它只是跳过了延迟
def StartTheSpam():
global TimeLable, ErrorLabel
#destoryes error labels and the countdown timer
try:
for child in root.winfo_children():
if child == TimeLable or child == ErrorLabel:
child.destroy()
except NameError:
pass
#needed for fail-safe 1
mouse = MouseController()
countdown_value = 5
counter = tk.StringVar()
counter.set(countdown_value)
TimeLable = tk.Label(frame, textvariable=counter, padx=10, pady=5, bg=Modes[mode.get()][3]['background'], fg=Modes[mode.get()][2]['text'])
TimeLable.pack()
#coundown
for countdown in range(1, countdown_value):
root.after(1000 * countdown, counter.set, countdown_value - countdown)
x = 100
y = 100
try:
with open(PreferencesStorage['FilePath'], 'r') as SpamText:
while PreferencesStorage['loop']:
for word in SpamText:
#fail safe 1
if x < 21 and y < 21:
break
TempX, TempY = mouse.position
x = int(TempX)
y = int(TempY)
#fail-safe 2
if keyboard.is_pressed('ctrl+d'):
break
keyboard.write(word)
print(word)
#return to begining when at end, thats why its outside of the loop
SpamText.seek(0)
for word in SpamText:
keyboard.write(word)
except FileNotFoundError:
NoFile = tk.Label(frame, text = 'Please Select A File', padx=10, pady=5, fg=Modes[mode.get()][2]['text'], bg=Modes[mode.get()][3]['background'])
NoFile.pack()
解决方案
root.after
不会造成延迟。那就是“请让主循环稍后调用此函数”。您的代码将非常快速地将 5 个计时器回调请求排队,然后继续。回调将在稍后发生。
当您为 GUI 编写代码时,您必须开始考虑事件驱动编程。当您创建小部件或调用“pack”时,什么都不会发生。所做的只是排队等待稍后处理的消息。在将来的某个时候,当mainloop
能够执行时,您的消息将被弹出并处理。只有这样,您的可见屏幕才会改变。这需要改变你编程的方式。您设置屏幕,启动主循环,然后等待事件。你的事件回调改变状态并返回,后台的 Tk 会更新屏幕。
推荐阅读
- excel - Excel 根据多个搜索条件查找多个唯一值
- kubernetes - Openshift Origin 3.6 删除 pod 总是与终结器一起挂起:-foregroundDeletion
- python - Selenium webdriver 无法在 Jupyter Notebook 的一个单元格中定位元素并将其定位在另一个单元格中
- bash - 如何尾随-F,但只保留最后5行的滚动输出
- kubernetes - 在最新的 0.7 版本中,OpenEBS Jiva 卷大小的单位是否有任何变化?
- javascript - 在 Angular 中使用第三个插件
- android - 如何使这张图片可点击以以编程方式重定向任何活动?
- javascript - 围绕三角形画布旋转圆圈
- c# - AutoMapper - 将派生类映射到 Dto
- angular - 如何在 Angular 中包含材质图标库?