# https://zditect.com/main-advanced/python/tkinter-after.html
# 无意间查到上述网址,但程序代码略有问题,进行修正。
import tkinter as tk
from tkinter import ttk
import time
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Tkinter `after()` Demo')
self.geometry('300x100')
self.style = ttk.Style(self)
self.button = ttk.Button(self, text='Wait 3 seconds')
self.button['command'] = self.start
self.button.pack(expand=True, ipadx=10, ipady=5)
def start(self):
self.change_button_color('red')
time.sleep(3)
self.change_button_color('black')
# tkinter更新颜色必须在主线程,由于没有返回主线程的路径,tkinter没能及时更改颜色,延时3秒后,又更改颜色为黑色,之后便立即执行,所以实际效果是始终为黑色
# 要想实现”变红色-延时3秒-变黑色“效果, 可以使用update函数强制执行一次主线程,以便处理挂起的事件(self.change_button_color('red')),然后延时3秒(用不加回调函数的after(3000)或者sleep(3)均可)
# self.button.update()
# self.button.after(3000)
# 也可以直接使用带回调函数的after函数,该函数作用是向事件循环(待办列表)中添加一个事件(回调函数)以及(延时)运行它的时间,到时间mainloop会执行回调函数
# self.button.after(1, lambda: self.change_button_color('red'))
# self.button.after(3000, lambda: self.change_button_color('black'))
def change_button_color(self, color):
self.style.configure('TButton', foreground=color)
if __name__ == "__main__":
app = App()
app.mainloop()