Python中如何给Button绑定两个延迟函数?为何仅第二个生效?
Tkinter按钮绑定延迟函数仅第二个生效的解决办法
你遇到的问题并不是第一个函数没执行,而是两个after都设置了2000毫秒的延迟,导致update和update2几乎同时被调用。update刚把输入框背景设为红色,update2立刻将其改为蓝色,所以视觉上只能看到最终的蓝色效果。
方案1:错开两个函数的延迟时间
通过给第二个函数设置更长的延迟,让两个操作依次显示:
from tkinter import * def update(): myEntry.config(bg="red") def update2(): myEntry.config(bg="blue") root = Tk() myEntry = Entry(root) myEntry.pack() # 第一个函数延迟2000ms执行,第二个延迟4000ms执行 myButton = Button(text="test", command=lambda: [myEntry.after(2000, update), myEntry.after(4000, update2)]) myButton.pack() root.mainloop()
方案2:让第二个函数在第一个执行后触发
在第一个函数内部调用after来触发第二个函数,保证执行顺序:
from tkinter import * def update(): myEntry.config(bg="red") # 第一个函数执行完成后,延迟2000ms执行第二个函数 myEntry.after(2000, update2) def update2(): myEntry.config(bg="blue") root = Tk() myEntry = Entry(root) myEntry.pack() # 仅触发第一个函数,后续流程由update控制 myButton = Button(text="test", command=lambda: myEntry.after(2000, update)) myButton.pack() root.mainloop()
方案3:合并为一个顺序执行的函数
将两个操作整合到一个函数中,通过内部延迟控制顺序:
from tkinter import * def update_sequence(): myEntry.config(bg="red") # 延迟2000ms后切换为蓝色 myEntry.after(2000, lambda: myEntry.config(bg="blue")) root = Tk() myEntry = Entry(root) myEntry.pack() myButton = Button(text="test", command=lambda: myEntry.after(2000, update_sequence)) myButton.pack() root.mainloop()
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

