Python Tkinter,如何同步多个闪烁的小部件?

问题描述 投票:1回答:1

这是我的第一个问题!

我创建了多个自定义窗口小部件(基于画布),它们具有相同的闪烁方法。当我单击它们(使用bind())时,它们应该闪烁(使用after()回调),直到我再次单击它们。

这是有效的,但是它们的闪烁是异步的,因为当我单击小部件时它开始闪烁。

我想同步他们的闪烁,我不知道该怎么用。

我想到了一个主要的闪烁功能,该功能会将事件发送到所有小部件,但这意味着每个小部件都将具有双重绑定,并且我不确定这是可能的。

下面是一个简化的示例:

import tkinter as tk


def flash(button):
    current_color = button.cget("background")
    next_color = "green" if current_color == "red" else "red"
    button.config(background=next_color)
    root.after(1000, flash, button)


root = tk.Tk()

Button1 = tk.Button(root, text="Button1", background="green")
Button2 = tk.Button(root, text="Button2", background="green")

Button1.pack()
Button2.pack()

Button1.bind("<ButtonPress-1>", lambda event: flash(Button1))
Button2.bind("<ButtonPress-1>", lambda event: flash(Button2))

root.mainloop()
python tkinter
1个回答
0
投票

您可以尝试做某事。像这样:

import tkinter as tk
import time


class Blinker:
    def flash(self, button):
        current_color = button.cget("background")
        next_color = "green" if current_color == "red" else "red"
        button.config(background=next_color)
    def ch(self, i):
        self.b[i] = not self.b[i]
    def __init__(self):
        self.root = tk.Tk()

        self.b = [False, False]

        Button1 = tk.Button(self.root, text="Button1", background="green")
        Button2 = tk.Button(self.root, text="Button2", background="green")

        Button1.pack()
        Button2.pack()

        Button1.bind("<ButtonPress-1>", lambda event: self.ch(0))
        Button2.bind("<ButtonPress-1>", lambda event: self.ch(1))

        while 1:
            if self.b[0]:
                self.flash(Button1)
            if self.b[1]:
                self.flash(Button2)
            t = time.time()
            while time.time()-t<1:
                self.root.update()
Blinker()

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.