这是我的第一个问题!
我创建了多个自定义窗口小部件(基于画布),它们具有相同的闪烁方法。当我单击它们(使用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()
您可以尝试做某事。像这样:
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()
希望有帮助!