Я пытаюсь создать радужную кнопку tkinter

#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()