🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

4578閲覧

while をtkinterのボタンで停止させたい

yamatail

総合スコア77

Python 3.x

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

0グッド

0クリップ

投稿2019/11/20 00:38

python3 で簡単なアプリを製作する予定です。

フォルダの中を監視し、新しいテキストファイルが出来たら
そのファイルにとある処理をするというものです。

そこでフォルダの中を監視するために
フォルダを監視する処理をwhileを用いて
更新する変数update_intarbal
監視するかどうかの変数watch_mode
の2つの変数を設定して、watch_modeが1なら監視、0なら終了する
という組み立てにしようかなと思っています。

実現したい動作は、

アプリを起動する
[アプリ起動]

[tkinterフレーム立ち上がる(Label:監視モードとButton:STOP)]

[whileループしている(watch_mode=1で監視状態)]

アプリを終了する
[tkinterフレームのButton:STOPを押してwatch_mode=0に更新する]

[whileループを抜ける(watch_mode=0)]

[アプリ停止]

という感じで、ストップしたい時は、tkinterのSTOPボタンを押せば
watch_modeが0に更新されwhileループを抜けるという感じです

なんとか以下のコードを書いたのですが、理想とは程遠く...
今のところtkinterの動作とwhileが一緒に動いてくれず
またstopボタンを押してもwatch_modeも更新されず無限ループになってしまします。

もし、詳しい方いらっしゃいましたら、アドバイスを頂けると大変助かります。

python

1import tkinter as tk 2from time import sleep 3 4def main(): 5 watch_mode = 1 #自動変換モード 6 while_loop = 0 #初期動作の管理 7 update_intarval = 5 #更新時間(s) 8 9 while watch_mode == 1: 10 if while_loop == 0: #1回目だけ動作させる 11 while_loop = 1 12 13 showinfo = tk.Tk() 14 15 frame_top = tk.Frame(showinfo,bd=2,relief="ridge") 16 frame_top.pack(fill="x",pady=2) 17 18 label1 = tk.Label(frame_top, text="監視モードだよ") 19 label1.pack(side="left") 20 21 frame_bottom = tk.Frame(showinfo,bd=2) 22 frame_bottom.pack(fill="x") 23 24 def stop_convert(): 25 watch_mode = 0 26 showinfo.destroy() 27 28 button1 = tk.Button(frame_bottom, text="STOP", bg="#f0e68c", fg="#ff0000", command=stop_convert) 29 button1.pack() 30 showinfo.mainloop() 31 32 sleep(update_intarval) 33 print(watch_mode) 34 35if __name__ == '__main__': 36 main()

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

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

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

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

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

t_obara

2019/11/20 01:32

whileループではなく、タイマーなどを利用しましょう。
yamatail

2019/11/20 06:33

threading.timerなどのことでしょうか。 知識不足で知りませんでした。勉強してみます!
yamatail

2019/11/20 07:14

ちょっと勉強して作り直してみます。 出来上がったら回答欄にでも書き込みますので、お暇そうでしたら見てやって下さい。 アドバイスありがとうございます。
guest

回答1

0

自己解決

アドバイス頂いたようにtkinter.afterを使って作ってみました。
一応思っていた感じの動きになりました。

以下、コード載せときます。

何か、アドバイス等あればお願い致します。m(_ _)m

python

1import tkinter as tk 2 3def main(): 4 after_id = None 5 repet_nums = 0 6 update_intarval = 100 #更新時間(msec) 7 8 def convert_data(): 9 global after_id 10 ####この下の部分に繰り返したい操作を書く######################################### 11 12 global repet_nums 13 repet_nums += 1 14 15 print("フォルダを見て新しいファイル出来てたらそのファイルを変換するよ", repet_nums) 16 if repet_nums == 1: 17 print("ikkaime") 18 19 ############################################################################# 20 21 after_id = showinfo.after(update_intarval, convert_data) 22 23 def start(): 24 global repet_nums 25 repet_nums = 0 26 convert_data() 27 28 def stop_convert(): 29 global after_id 30 if after_id: 31 showinfo.after_cancel(after_id) 32 after_id = None 33 showinfo.destroy() 34 35 showinfo = tk.Tk() 36 37 frame_top = tk.Frame(showinfo,bd=2,relief="ridge") 38 frame_top.pack(fill="x",pady=2) 39 40 label1 = tk.Label(frame_top, text="監視モードだよ") 41 label1.pack(side="left") 42 43 frame_bottom = tk.Frame(showinfo,bd=2) 44 frame_bottom.pack(fill="x") 45 46 button1 = tk.Button(frame_bottom, text="STOP", bg="#f0e68c", fg="#ff0000", command=stop_convert) 47 button1.pack() 48 49 start() 50 51 showinfo.mainloop() 52 53if __name__ == '__main__': 54 main()

投稿2019/11/22 08:21

編集2019/11/22 08:26
yamatail

総合スコア77

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問