我正在尝试执行按顺序更改 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 秒后将其上方的框架变为黑色。我从未见过任何红色背景。我是否滥用了该功能?或者这是错误的做法?
正如 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()