質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Q&A

解決済

1回答

387閲覧

root.afterの実行されるタイミングを変えたい

ray

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

0グッド

0クリップ

投稿2022/08/28 07:11

前提

Pythonで駅の電光掲示板のように一定時間で文字が変わるシステムを作っています。
予定では、3秒日本語、3秒英語のようにしたいです。12歳のガキなので文章がなっていないかもしれませんが回答お願いします。

実現したいこと

前述の通り、時間で文字を変更するということです。ちなみにTkinterのLabelを使用しています。

発生している問題・エラーメッセージ

予定では09:37 快速 東京→09:37 Rapid Tokyo
のように文字が3秒おきに変更されるはずなのですが、はじめから09:37 Rapid Tokyoと表示されてしまうということです。

該当のソースコード

Python

1import tkinter as tk 2root=tk.Tk() 3root.geometry("854x480") 4root.title("駅発車標本体") 5 6def frame_0937_0947_japanese_def(): 7 var_kinds_0937=tk.StringVar() 8 var_kinds_0937.set(" 快速") 9 var_for_0937=tk.StringVar() 10 var_for_0937.set(" 東京") 11 var_kinds_0947=tk.StringVar() 12 var_kinds_0947.set("各駅停車") 13 var_for_0947=tk.StringVar() 14 var_for_0947.set("東京") 15 16 frame_0937=tk.Frame(pady=5, padx=5, relief=tk.RAISED) 17 label_0937_time=tk.Label(frame_0937, text=" 9:37 ", font=("Arial",60), fg="green") 18 label_0937_kinds=tk.Label(frame_0937, textvariable=var_kinds_0937, font=("Arial",60), fg="red") 19 label_0937_for=tk.Label(frame_0937, textvariable=var_for_0937, font=("Arial",60), fg="green") 20 frame_0947=tk.Frame(pady=5, padx=5, relief=tk.RAISED) 21 label_0947_time=tk.Label(frame_0947, text=" 9:47 ", font=("Arial",60), fg="green") 22 label_0947_kinds=tk.Label(frame_0947, textvariable=var_kinds_0947, font=("Arial",60), fg="gray") 23 label_0947_for=tk.Label(frame_0947, textvariable=var_for_0947, font=("Arial",60), fg="green") 24 frame_0937.pack(fill=tk.X) 25 label_0937_time.pack(side=tk.LEFT) 26 label_0937_kinds.pack(side=tk.LEFT, padx=5) 27 label_0937_for.pack(side=tk.LEFT, padx=5) 28 frame_0947.pack(fill=tk.X) 29 label_0947_time.pack(side=tk.LEFT) 30 label_0947_kinds.pack(side=tk.LEFT, padx=5) 31 label_0947_for.pack(side=tk.LEFT, padx=5) 32 33 root.after(3000) 34 35 var_kinds_0937.set("Rapid") 36 var_for_0937.set("Tokyo") 37 var_kinds_0947.set("Local ") 38 var_for_0947.set("Tokyo") 39 40button=tk.Button(command=frame_0937_0947_japanese_def) 41button.pack() 42root.mainloop() 43

試したこと

StringVarの位置を変更してみましたが、labelの方で変数が見つからないと言われてしまいました。

補足情報(FW/ツールのバージョンなど)

バージョンはPython 3.8.8です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

afterメソッドの使いかたが間違えています。

ちょっと検索しただけでみつけたサイトですが参考までに
https://office54.net/python/tkinter/after-method-schedule#section1

tkinterのようなGUIのアプリは「イベントドリブン」なアプリで、マウスクリックやキーインなどの何らかのイベントをきっかけにしてあらゆる動作をします。

そんなアプリに定期的な動作をさせるためにafterメソッドがあります。
afterメソッドは、after(xx, callback=yy)という形で呼び出して、「xx秒後にyyの処理をする」という設定をします。

質問のものであれば、yyの処理は「今日本語が表示されていれば英語に、英語が表示されていれば日本語に切り替える」というものになります。
そういう関数、たとえばchange_language、を作って、「after(3000, callback=change_language)のように呼び出せばOKです。
ただ、それだと、3秒後に1回変化して終りです。 3秒毎に実行させるには、change_language の中の最後にafter(3000, callback=change_language) を呼びます。これで、3秒毎に実行されるようになります。

投稿2022/08/28 08:01

TakaiY

総合スコア12657

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

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

ray

2022/08/30 08:02

ありがとうございます!ガキの質問に答えていただいてありがとうございました!!参考にさせていただきます!!
TakaiY

2022/08/30 08:16

「ガキの質問」なんてことは全くありませんよ。「ガキ」のうちにこんな素晴しいことをやっているのは立派です。これからも頑張ってください。
ray

2022/08/30 08:57

成功しました!!本当にありがとうございました😄
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問