実現したいこと
Tkinterを使って、一定時間ごとに画面上の文字列が切り替わる仕組みを作りたいです。
発生している問題・分からないこと
グローバル変数とafterを使い、関数を再帰的に読み出し、画面上の文字列が一定時間ごとに切り替わる仕組みを作ろうとしました。
しかし、実行すると数秒経ってからリストの最後の要素だけが表示され、途中の処理が見えません。
Classを使わない方法だと成功したのですが、Classを使って同じことをしようとすると失敗します。
該当のソースコード
Python
1import tkinter as tk 2 3counter = 0 4 5class hoshimeguri: 6 def __init__(self): 7 self.song = ["あかいめだまのさそり","ひろげた鷲のつばさ","あおいめだまの小いぬ","ひかりのへびのとぐろ","オリオンは高くうたい","つゆとしもとをおとす"] 8 9 self.root = tk.Tk() 10 self.root.title("星めぐりの歌") 11 12 self.label = tk.Label(self.root,width=20,height=2,padx=10,pady=10,anchor="nw",justify=tk.LEFT,text="星めぐりの歌") 13 self.label.pack(padx=10,pady=10) 14 15 self.button = tk.Button(self.root,text="歌う") 16 self.button.bind("<Button-1>",self.sing) 17 self.button.pack(padx=10,pady=10) 18 19 self.root.mainloop() 20 21 def sing(self,event): 22 global counter 23 self.label.config(text=self.song[counter]) 24 counter += 1 25 if counter < len(self.song): 26 self.root.after(1000, self.sing(event)) 27 else: 28 self.counter = 0 29 30hoshimeguri() 31
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
https://denno-sekai.com/tkinter-kitchen-timer/
上記のサイトを参考にして、self.after_idにafterの処理を入れましたが、結果は変わりませんでした。
Tkinterで時計を作るソースコードも複数確認したのですが、Classを用いて作っているコードを見つけられませんでした。
補足
特になし
after メソッドには callable オブジェクトを渡す必要がありますので、引数がある場合には列挙するか、lambda 関数を使用してください。
self.root.after(1000, self.sing(event))
=>
self.root.after(1000, self.sing, event)
# もしくは lambda 関数を使用する
# self.root.after(1000, lambda: self.sing(event))
それから、sing() メソッドで、
self.counter = 0
としていますが、counter 変数はインスタンス変数ではなくグローバル変数なので、
counter = 0
とするのだと思います。
コメントありがとうございます。引数の列挙&counter変数の修正で無事解決しました!
ベストアンサーに選びたいので、同じ内容を回答欄に投稿いただけますでしょうか?
回答1件
あなたの回答
tips
プレビュー