Вы можете сохранить мигающие кнопки в коллекции (здесь, в наборе, как закрытие, которое отслеживает, какие кнопки в данный момент мигают), и использовать это для синхронизации мигания. Я добавил очистку обратных вызовов, чтобы избежать множества перекрывающихся мигающих команд.
(я также использовал foreground
i / o background
цвета, чтобы заставить его работать в моей системе.)
import tkinter as tk
def flash(button, buttons=set(), _after=[]):
if button not in buttons:
buttons.add(button)
current_color = button.cget("foreground")
next_color = "blue" if current_color == "red" else "red"
for button in buttons:
button.config(foreground=next_color)
for after_id in _after:
root.after_cancel(after_id)
if buttons:
_after.append(root.after(1000, flash, button))
if __name__ == '__main__':
root = tk.Tk()
Button1 = tk.Button(root, text="Button1", foreground="blue")
Button2 = tk.Button(root, text="Button2", foreground="blue")
Button1.pack()
Button2.pack()
Button1.bind("<ButtonPress-1>", lambda event: flash(Button1))
Button2.bind("<ButtonPress-1>", lambda event: flash(Button2))
root.mainloop()
Следующая чуть более сложная функция позволяет остановить мигание кнопки при втором нажатии; он работает, проверяя, был ли вызов щелчком или обратным вызовом; если это был щелчок, удаляет кнопку из мигающего набора.
def flash(button, callback=False, buttons=set(), _after=[]):
if callback:
pass
elif button not in buttons:
buttons.add(button)
else:
buttons.remove(button)
current_color = button.cget("foreground")
next_color = "blue" if current_color == "red" else "red"
for button in buttons:
button.config(foreground=next_color)
for after_id in _after:
root.after_cancel(after_id)
if buttons:
_after.append(root.after(1000, flash, button, True))