#python #tkinter
#python #tkinter
Вопрос:
def RainbowButton():
btn.config(bg=red)
btn.config(bg=purple)
btn.config(bg=yellow)
btn.config(bg=orange)
btn.config(bg=blue)
btn.config(bg=lightblue)
btn.config(bg=green)
btn.config(bg=black)
def ButtonUpdate():
RainbowButton()
window.after(10, ButtonUpdate)
ButtonUpdate()
Это код, который я придумал, но он не работает. Кнопка просто черная, когда я запускаю программу, цвета не меняются.
Комментарии:
1. Изменения состояния виджета обрабатываются только при возвращении в основной цикл, поэтому у ваших цветов, отличных от черного, никогда не будет возможности применить их к кнопке, даже на миллисекунду. Вам нужно будет применять один цвет за раз и ждать, пока в следующий раз ваша функция не будет вызвана с помощью
.after()
, чтобы применить следующий цвет.
Ответ №1:
Хитрость заключается в том, чтобы подавать цвета на кнопку по одному за раз, один раз при каждом запуске ButtonUpdate()
функции. Вы можете решить эту проблему с помощью итератора. Когда у итератора заканчиваются элементы, он выдает ошибку, которую я фиксирую с try
помощью предложения. Я отрегулировал время для after()
функции, чтобы эффект был виден лучше.
import tkinter as tk
window = tk.Tk()
btn = tk.Button(window, text='Button')
btn.pack(padx=50, pady=30)
rainbow_colors = ['red','purple','yellow','orange','blue',
'lightblue','green','black']
color_iterator = iter(rainbow_colors)
def ButtonUpdate():
try:
color = next(color_iterator)
btn.config(bg=color)
except StopIteration:
return
window.after(500, ButtonUpdate)
ButtonUpdate()
window.mainloop()