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

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

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

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

Tkinter

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

Q&A

解決済

1回答

1532閲覧

Python3 Tkinter ウィンドウを閉じたときに応答なしになる

person

総合スコア223

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2020/11/09 07:30

編集2020/11/09 10:26

前回の質問で、tkinterが応答なしになる件について質問しました。
これに関係することで質問です。

表示はメインスレッド、CSV読み取り等はサブスレッドで動作させることにしました。

CSVは繰り返し読みたいです(内容が変化するため)。
CSVを読むのは3分間隔にしたいです。
そのため、現在はwhileループ内にCSV読み取りの処理とtime.sleep(180)を入れています。
これで3分ごとに読むことはできるのですが、ウィンドウを閉じた時に応答なしになります。
sleep()が終了すると閉じます(sleep中は閉じることができない)。

かといって閉じるボタンを押してから最大3分待つというのはアプリ利用者からしたら嫌な仕様です。

CSV読み取り間隔を3分間隔にしたい場合、sleep()を使わずに実現することは可能ですか?
または、sleep()を使っても応答なしにしない方法はありますか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点:

終了時に thread.join すると、スレッドが終了するまでsleep の間待つことになります。
その間 Tkiner を終了していないと、応答なし状態になります。


簡単な対策 (sleep()を使っても応答なしにしない方法)

  • 終了時に 「thread.join をせず」に、「daemon=True」 オプション付きでスレッドを作ると

 終了時スレッドは強制終了されます。

※ 但し、サブスレッド側で書き込み処理をしていると、
データ破損の原因になります。

読み取りのみの場合は、比較的安全ですが、他にも行っている処理があり、
影響があるか解らない場合は避けた方が良いです。
ファイルopen中に終了されると、強制終了になってしまいます。
→ タイミング次第で起こるバグの原因になる(可能性がある)。


解決策 (sleep()を使わずに実現する)

  • スレッドはキューの読み取りを待ち受けるようにする
  • アプリ終了時には、キューの待ち受けループを抜けるメッセージを送る
  • 3分毎は、Tkinter のタイマー(after)でスケジュールを行い、

 キューに読み出し処理を通知するようにします。

投稿2020/11/09 10:37

編集2020/11/09 14:22
teamikl

総合スコア8664

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

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

person

2020/11/09 11:23

回答ありがとうございます。 リファレンスのdeamonを見ると > このスレッドがデーモンスレッドか (True) か否か (False) を示すブール値。(省略) とありますが、デーモンスレッドとは何でしょうか? デーモンスレッドかそうでないかでの違いは何でしょうか?
teamikl

2020/11/09 12:42 編集

リファレンスに説明があります(下で引用) 注釈のきちんとスレッドを停止~は、 キューや停止フラグを用いて終了を通知し、 thread.join で後始末が終わるまで待つ方法が該当します。 但し、その場合は sleep の待機時間も待つことになるので、 今回のケースに当てはめると、GUIは応答なしになってしまいます。 デーモンスレッドを紹介した意図は、「sleep()を使っても応答なしにしない」手段としてです。 場合によっては、他の問題の原因になることも有るので、 出来る限り、後始末もきちんと終わらせて終了する方が良いです。 デーモンスレッドを利用して終了する場合は、 (ファイルopen後のclose等) 後始末に相当する処理が出来ません。 ---- https://docs.python.org/ja/3.7/library/threading.html より引用 スレッドには "デーモンスレッド (daemon thread)" であるというフラグを立てられます。 このフラグには、残っているスレッドがデーモンスレッドだけになった時に Python プログラム全体を終了させるという意味があります。フラグの初期値はスレッドを生成したスレッドから継承します。フラグの値は daemon プロパティまたは daemon コンストラクタ引数を通して設定できます。 注釈 デーモンスレッドは終了時にいきなり停止されます。デーモンスレッドで使われたリソース (開いているファイル、データベースのトランザクションなど) は適切に解放されないかもしれません。きちんと (gracefully) スレッドを停止したい場合は、スレッドを非デーモンスレッドにして、Event のような適切なシグナル送信機構を使用してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問