在 Tkinter 中安排延迟的顺序执行

问题描述 投票:0回答:1

我正在尝试执行按顺序更改 tkinter UI 外观的函数,但会有延迟,在此期间用户可以在第一次更改后但在第二次更改之前查看状态。

我很快就学会了不要使用

time.sleep(1000)
插入 1 秒延迟,因为它会导致 UI 停止(并在我的机器上崩溃。尽管其他答案表明它不应该崩溃)。

我尝试使用

.after(1000)
;

def callback():
    self.colorFrame.configure(background="red")
    self.after(1000)
    self.colorFrame.configure(background="black")

self = tk.Tk()

self.colorFrame = tk.Frame(self, width=500, height=500)
self.colorFrame.pack()
self.parentFrame = tk.Frame(self)
self.parentFrame.pack()
self.button = tk.Button(self.parentFrame, text="Trigger Changes", command=callback)
self.button.pack()

tk.mainloop()

至少在我的机器上,运行该代码片段会创建一个带有按钮的窗口,按下该按钮会在 1 秒后将其上方的框架变为黑色。我从未见过任何红色背景。我是否滥用了该功能?或者这是错误的做法?

python user-interface tkinter delay
1个回答
0
投票

正如 jasonharper 所建议的,状态机是实现此结果的更好方法,而无需将各个函数调用链接在一起。对于颜色循环的情况,我想出了这个代码:

def callback():
    colorCycleStateMap = {
        "red": "orange",
        "orange": "yellow",
        "yellow": "green",
        "green": "violet",
        "violet": "indigo",
        "indigo": "blue",
        "blue": "black",
        "black": "break"
    }
    currentColor = self.colorFrame["background"]
    if colorCycleStateMap[currentColor] == "break":
        return
    
    self.colorFrame.configure(background=colorCycleStateMap[currentColor])
    self.after(1000, callback)

self = tk.Tk()

self.colorFrame = tk.Frame(self, width=500, height=500, background="red")
self.colorFrame.pack()
self.parentFrame = tk.Frame(self)
self.parentFrame.pack()
self.button = tk.Button(self.parentFrame, text="Trigger Changes", command=callback)
self.button.pack()
© www.soinside.com 2019 - 2024. All rights reserved.