使用`after时无法“闪烁”/更改tkinter程序的颜色`

2024-06-07 12:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过以下方式改变标签小部件的颜色来模拟其闪烁:

a)更改为颜色#1,暂停1秒

b)更改为颜色#2,暂停1秒

c)使用tk.after再次循环以重新运行此过程。在

但结果是颜色不变。在

self.blink_status是一个表示通信状态正常的索引,它等于1。当然,代码是用常量值self.blink_status=1进行测试的

def blink_tx(self):
    if self.blink_status == 1:
        self.tx_label["bg"] = 'green'
        self.tx_value.set('Tx')
        sleep(1)
        self.tx_label["bg"] = 'blue'
        sleep(1)
    elif self.blink_status == 0:
        self.tx_label["bg"] = 'red'
        self.tx_value.set('*')
        sleep(2)
        self.tx_label["bg"] = 'orange'
    else:
        self.tx_label["bg"] = 'red'
        self.tx_value.set('x')
        sleep(2)

    self.status_frame.after(3500, self.blink_tx)

self.tx_label和{}的定义方式:

^{pr2}$

Tags: selfvalue颜色部件status方式sleepred
3条回答

不能在tkinter实例内部使用sleep()。Tkinter是一个单线程应用程序,当您告诉它休眠时,事件列表中的所有内容都将被挂起/冻结。对于代码中的任何延迟,都需要使用after()。{t2>方法中的延迟是用来管理的。在

因为在你的例子中,你运行了两个独立的延迟,我的例子将提供两个延迟。在

下面是一个由您提供的代码组成的示例。 我们可以设置我们需要购买的所有延迟提供第二个功能。我在代码中添加了一个随机数生成器来演示颜色的连续变化。在

import tkinter as tk
import random


class MainApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.tx_value = tk.StringVar()
        self.tx_value.set("test")
        self.blink_status = 1

        self.tx_label = tk.Label(self, textvariable=self.tx_value, relief=tk.GROOVE, width=4, height=2)
        self.tx_label.grid(row=0, column=4, sticky=tk.E)
        self.blink_tx()

    def blink_tx_step_2(self, color=None):
        if color != None:
            self.tx_label["bg"] = color
        self.after(3500, self.blink_tx)

    def blink_tx(self):
        if self.blink_status == 1:
            self.tx_label["bg"] = 'green'
            self.tx_value.set('Tx')
            self.blink_status = random.randint(0, 2)
            self.after(1000, self.blink_tx_step_2, 'blue')
        elif self.blink_status == 0:
            self.tx_label["bg"] = 'red'
            self.tx_value.set('*')
            self.blink_status = random.randint(0, 2)
            self.after(2000, self.blink_tx_step_2, 'orange')
        else:
            self.tx_label["bg"] = 'red'
            self.tx_value.set('x')
            self.blink_status = random.randint(0, 2)
            self.after(2000, self.blink_tx_step_2)


if __name__ == '__main__':
    app = MainApp()
    app.mainloop()

time.sleep()正在阻止您的GUI更新;请不要将其与GUI一起使用。请改用root.after。在

单击GUI时,以下标签将开始闪烁:
您可以将其修改为您自己未提供的代码。在

import tkinter as tk


class BlinkerLabel(tk.Label):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.status = 1

    def blink(self, event):
        if self.status == 1:
            self["bg"] = 'green'
        elif self.status == 0:
            self["bg"] = 'red'

        self.status = (self.status + 1) % 2
        self.after(3500, self.blink, 'dummy_event')  # <  this creates the 'delay' between blinks


if __name__ == '__main__':

    root = tk.Tk()
    lbl = BlinkerLabel(root, text='I blink!')
    lbl.pack()

    root.bind('<Button-1>', lbl.blink)

    root.mainloop()

感谢@Mike SMT和@Reblochon Masque的帮助。TNX大量

我的代码修复:

def blink_tx(self):
    def blink_1(color1, color2, txt):
        self.tx_label["bg"] = color1
        self.tx_value.set(txt)
        self.after(t_blink, blink_2, color2)

    def blink_2(color):
        self.tx_label["bg"] = color
        self.after(t_blink, self.blink_tx)

    t_blink = 2500
    if self.blink_status == 1:
        blink_1('green', 'orange', 'Tx')
    elif self.blink_status == 0:
        blink_1('red', 'yellow', '*')
    else:
        blink_1('red', 'red', 'X')

相关问题 更多 >

    热门问题