Tkinterで時間表示をリアルタイム更新したいです。
以前とは異なり、main()内にTkinterのウィジェットを記述することにしました。(後々必要になりそうなので)
そのため、時間表示のラベルもmain()内に記述しているのですが、Threadを立てたり、ウィジェット変数winを呼び出ししている部分でエラーが発生してしまいます。基本的に画面を表示したままの状態なので戻り値を使うことは無理だと思いグローバル変数を使おうと思ったのですが、ウィジェット変数のため普通の変数と違い、初期値の代入でうまくいかず(tk.Tk()を一時的に代入した後destroy()したがエラーが出てしまった)変数を共有することができません。
どなたか対処方法を教えてくださると幸いです。もちろん以前と違う対処方法を提示してくれてもいいです。
Python
1import tkinter as tk 2from datetime import datetime 3import time 4import threading 5import queue 6 7def main(): 8 win = tk.Tk() 9 10 f1 = tk.Frame(win) 11 f1.grid() 12 f2 = tk.Frame(win) 13 f2.grid(sticky="w") 14 15 time_label = tk.Label(f1, text="") 16 time_label.grid() 17 b = tk.Button(f2, text="Button") 18 b.grid() 19 20 win.mainloop() 21 22if __name__ == "__main__": 23 main() 24 25 26 """ 前回ご教授いただいた内容 27 28 #Queue(キュー)を生成(win生成前のLabel書き換え防止 29 message_queue = queue.Queue() 30 31 #現在日時の更新 32 is_valid = True 33 def print_nowtime(): 34 while is_valid: 35 now = datetime.now() 36 message_queue.put("{0:%Y/%m/%d %H:%M:%S}".format(now)) 37 time.sleep(1) 38 39 #ウィンドウクローズ時の、時刻表示ループフラグ終了用 40 def on_closing(): 41 global is_valid 42 is_valid = False 43 thread.join() 44 win.destroy() 45 46 #Queueを確認しLabelを更新 47 def check_queue(): 48 try: 49 msg = message_queue.get(0) 50 time_label["text"] = msg 51 except queue.Empty: 52 pass 53 54 #5ms後に再度この関数を呼ぶ(main thread上で動作) 55 win.after(5, check_queue) 56 57 #起動後すぐにcheck_queue関数を1度呼ぶように設定 58 win.after(0, check_queue) 59 #ウィンドウクローズ時の、時刻表示ループフラグ終了用 60 win.protocol("WM_DELETE_WINDOW", on_closing) 61 62 """

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/30 02:07