HZK
@HZK (Ritoku Sakamae)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

tkinterで複数の色を不規則に時間変化させることは可能ですか?

解決したいこと

tkinterにおいて、ラベルの色を時間経過によって、変化させようと考えています。
after()メソッドを使い、規則的に2色の変更なら可能です。しかし、複数の色を、不規則な時間間隔で変化させて、ループさせることは可能なのでしょうか。

発生している問題・エラー

以下のコードにおいて、ラベルの色を赤から始め、(青、白、緑、灰色)でループさせようと意図しました。しかし、緑からループが始まり、青は表示されずに残りの色でループし、この理由が分かりません。一つの関数に、複数のafter()メソッドが含まれることが問題かと思い、複数の関数に分割しても挙動は同じでした。教えて頂けたら幸いです。

該当するソースコード

import tkinter as tk

def update_off1():
    lb.configure(bg = "white")
def update_off2():
    lb.configure(bg = "gray")
def onoff():
    #1
    lb.configure(bg = "blue")
    lb.after(1000, update_off1)
    #2
    lb.configure(bg = "green")
    lb.after(2000, update_off2)
    lb.after(3000, onoff)

root = tk.Tk()
root.geometry("300x200")

lb = tk.Label(root, text = "LB1",relief = tk.RAISED, width = 50, bg = "red")
lb.pack()
lb.after(3000, onoff)
root.mainloop()
0

2Answer

こうするのはいかが?

import random
import tkinter as tk

CHANGE_TIMES = 500, 1000, 1500, 2000, 2500
COLORS = 'blue', 'white', 'green', 'gray'
color_index = 0

def change_color():
    global color_index
    message['bg'] = COLORS[color_index]
    color_index = (color_index + 1) % len(COLORS)
    message.after(random.choice(CHANGE_TIMES), change_color)

root = tk.Tk()
root.geometry("300x200")

message = tk.Label(root, text="LB1", relief=tk.RAISED, width=50, bg="red")
message.pack()
message.after(3000, change_color)
root.mainloop()
0Like

2点学ぶことができました。1点目は、widgetの引数はconfigureだけでなく、辞書型でも引数の変更が可能であること。2点目は、複数のafterメソッドを連結したり、そのメソッドに複数の関数を指定することは、うまくいかないこと。むしろ、afterメソッドは1つのみにして、指定される関数の中で、時間や色を変化させるように工夫をするのが良いということ。理解するのに手間取りましたが、助けて頂いて感謝してます!!。

0Like

Your answer might help someone💌