首页 > 解决方案 > 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()

标签: pythonpython-3.xtkinter

解决方案


root.after不会造成延迟。那就是“请让主循环稍后调用此函数”。您的代码将非常快速地将 5 个计时器回调请求排队,然后继续。回调将在稍后发生。

当您为 GUI 编写代码时,您必须开始考虑事件驱动编程。当您创建小部件或调用“pack”时,什么都不会发生。所做的只是排队等待稍后处理的消息。在将来的某个时候,当mainloop能够执行时,您的消息将被弹出并处理。只有这样,您的可见屏幕才会改变。这需要改变你编程的方式。您设置屏幕,启动主循环,然后等待事件。你的事件回调改变状态并返回,后台的 Tk 会更新屏幕。


推荐阅读