#質問
少し前に このページ で、Tkinterのウィンドウを閉じたときにエラーが出てしまうという質問をしました。
この時のエラーについてはベストアンサーに致しました方の回答で解決できたのですが、そのプログラム(コードはほぼ同じ)を別のプログラムに使ってみたところ、まったく同じエラーが出てしまいました。(前回はVSCodeで実行したときのエラーメッセージを貼り付けたため表記に多少違いがありますが、書いてある内容は同じです)
エラーの特徴
- プログラム実行時(Tkinterのウィンドウが表示される直前)にエラーメッセージが出る(前の質問はウィンドウを閉じたときだが、今回は開く直前)
- このエラーが発生すると、日時表示されない
- たまに、このエラーが発生することなく、日時表示も正常であるときもある(できるときとできないときの違いは分からない。もちろん同じソースコードである。)
- main()に記述した内容は、期待通りに動作する
#エラーメッセージ(IDLEで実行)
=============== RESTART: /home/pi/デスクトップ/main.py =============== Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner self.run() File "/usr/lib/python3.5/threading.py", line 862, in run self._target(*self._args, **self._kwargs) File "/home/pi/デスクトップ/main.py", line 53, in print_nowtime time_label["text"] = "{0:%Y/%m/%d %H:%M:%S}".format(now) File "/usr/lib/python3.5/tkinter/__init__.py", line 1349, in __setitem__ self.configure({key: value}) File "/usr/lib/python3.5/tkinter/__init__.py", line 1342, in configure return self._configure('configure', cnf, kw) File "/usr/lib/python3.5/tkinter/__init__.py", line 1333, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) RuntimeError: main thread is not in main loop >>>
#利用したソースコード(実際はmain()の中身が違う)
import tkinter as tk import datetime import time import threading #ウィンドウ作成 win = tk.Tk() win.title("Tkinter Test") win.geometry("720x480") #現在日時を表示 time_label = tk.Label(win,text="") time_label.grid() #現在日時の更新 is_valid = True def print_nowtime(): while is_valid: now = datetime.datetime.now() time_label["text"] = "{0:%Y/%m/%d %H:%M:%S}".format(now) time.sleep(1) #動作が重くなるため #ThreadError対策 def on_closing(): global is_valid is_valid = False thread_1.join() # Windowを破棄 win.destroy() def main(): #ボタンが押されたらテキストボックス内のの文字列を表示 def push(): str = txtbox.get() print(str) txtbox.delete(0, tk.END) txtbox = tk.Entry() txtbox.grid() btn = tk.Button(win, text="click", command=push) btn.grid() if __name__ == "__main__": #時間表示と入力文字列表示を並行 try: thread_1 = threading.Thread(target=print_nowtime) thread_1.start() main() #とりあえず例外が生じたら弾く(試験的) except: print("except") win.protocol("WM_DELETE_WINDOW", on_closing) win.mainloop()
分かる方、もしくは何らかの見当がつく方、
回答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/13 00:20