teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

指摘事項修整

2021/07/18 05:57

投稿

Mikyrri
Mikyrri

スコア15

answer CHANGED
@@ -1,15 +1,21 @@
1
+ #### 7/18指摘箇所修整
2
+
1
3
  私は趣味でtkinterを弄っている程度ですが、
2
4
  参考になればと回答させていただきます。
3
5
 
4
- root.after の待機中はroot.mainloop()も停止し、描画は更新されません。
6
+ ~~root.after の待機中はroot.mainloop()も停止し、描画は更新されません。
5
7
  そのため、質問者様のプログラムのままですと
6
8
  StringVarを変更してもroot.afterで処理が一旦停止してしまいます。
7
9
  結果、そのまま3000ms後にLabelが更新されるまでもなくroot.quit()が開始されるので、
8
- ウィンドウが閉じてしまう、といった形になっています。
10
+ ウィンドウが閉じてしまう、といった形になっています。~~
11
+ **コメントにてteamikiさんからご指摘があり、ここは間違いでした。**
12
+ **root.after待機中でもmainloopは実行されるとのことです。**
9
13
 
10
14
  mainloopとは別に連続更新が必要な際は、
11
15
  threadingを使用して**tkでない方**の処理を別スレッドに渡してしまうのがよいかと思います。
12
16
  ※root.mainloop()はthreadingで別スレッドに渡すとうまく動作しないのでその点は留意しておいてください
17
+ **こちらも別スレッドからのGUI操作に関しては問題があるとの指摘を受けました。**
18
+ **詳細はコメントをご確認ください。**
13
19
 
14
20
  また、今回tkウィンドウを閉じるということでしたので
15
21
  root.quit()ではなくroot.destroy()に変更しています。
@@ -22,22 +28,11 @@
22
28
  ```python
23
29
  from tkinter import *
24
30
  from tkinter import ttk
25
- import threading
26
- import time
27
- import tkinter
28
31
 
29
- #スレッド用
30
- def sleep_and_close():
31
- time.sleep(3) #3秒待機
32
- root.destroy() #tkウィンドウを閉じる
33
-
34
-
35
32
  #クリック動作(ボタンを押したらラベルを「clicked」に更新して、3秒後にウィンドウを閉じる
36
33
  def clicked():
37
34
  s.set("clicked")
38
- #押されてから待機~更新の処理を別スレッドで行う。
39
- subthread = threading.Thread(target=sleep_and_close)
40
- subthread.start()
35
+ root.after(3000, root.destroy)
41
36
 
42
37
  ~~~以下、同様~~~
43
38
  ```

1

「渡す」の文言が抜けていた

2021/07/18 05:57

投稿

Mikyrri
Mikyrri

スコア15

answer CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  mainloopとは別に連続更新が必要な際は、
11
11
  threadingを使用して**tkでない方**の処理を別スレッドに渡してしまうのがよいかと思います。
12
- ※root.mainloop()はthreadingで別スレッドにすとうまく動作しないのでその点は留意しておいてください
12
+ ※root.mainloop()はthreadingで別スレッドにすとうまく動作しないのでその点は留意しておいてください
13
13
 
14
14
  また、今回tkウィンドウを閉じるということでしたので
15
15
  root.quit()ではなくroot.destroy()に変更しています。