質問するログイン新規登録

Q&A

解決済

1回答

296閲覧

Python Tkinter after処理が思ったとおりに動かない

grove19

総合スコア1

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

1クリップ

投稿2025/11/13 04:55

2

1

実現したいこと

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を用いて作っているコードを見つけられませんでした。

補足

特になし

melian👍を押しています
tt-support👏を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2025/11/13 05:56 編集

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))
melian

2025/11/13 05:53

それから、sing() メソッドで、 self.counter = 0 としていますが、counter 変数はインスタンス変数ではなくグローバル変数なので、 counter = 0 とするのだと思います。
grove19

2025/11/13 06:09

コメントありがとうございます。引数の列挙&counter変数の修正で無事解決しました! ベストアンサーに選びたいので、同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

※ コメントから転記

after メソッドには callable オブジェクトを渡す必要がありますので、引数がある場合には列挙するか、lambda 関数を使用してください。

python

1self.root.after(1000, self.sing(event)) 2# => 3self.root.after(1000, self.sing, event) 4# もしくは lambda 関数を使用する 5# self.root.after(1000, lambda: self.sing(event))

参考までに、以下は after メソッドの説明です。

python

1>>> import tkinter as tk 2>>> help(tk.Tk.after) 3 4after(self, ms, func=None, *args) 5 6Call function once after given time. 7MS specifies the time in milliseconds. FUNC gives the function which shall be called. 8Additional parameters are given as parameters to the function call.

投稿2025/11/13 06:17

melian

総合スコア21548

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grove19

2025/11/13 06:31

無事解決しました、ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問