Tkinter的update()和after()与mainloop()

# 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaohouzi112233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值