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

回答編集履歴

4

コード修正

2020/11/26 11:10

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -43,7 +43,7 @@
43
43
  from threading import Thread
44
44
  import logging
45
45
 
46
- # POINT: 2回目以降の xrange は MainThread で実行されるのが確認できると思います
46
+ # POINT: 2回目以降の xfunc は MainThread で実行されるのが確認できると思います
47
47
 
48
48
  def xfunc(root):
49
49
  logging.info("xfunc")
@@ -60,7 +60,7 @@
60
60
  button = tk.Button(root, text="Quit", command=root.quit)
61
61
  button.pack()
62
62
 
63
- thread = Thread(target=xrange, args=(root,), daemon=True)
63
+ thread = Thread(target=xfunc, args=(root,), daemon=True)
64
64
  thread.start()
65
65
 
66
66
  root.mainloop()

3

追記: サンプルコードに関して

2020/11/26 11:10

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -81,4 +81,14 @@
81
81
   root.after で実行される関数、bind で登録した関数などは全て
82
82
   root.mainloop 内で実行されます。mainloop でGUIの描画やイベント処理をしているので、
83
83
   これらの関数では、処理をすぐ終わり mainloop に制御を返さなければなりません。
84
-  ログを取ってみて、メインスレッドで時間の掛かる処理をしていないか調べて見ましょう。
84
+  ログを取ってみて、メインスレッドで時間の掛かる処理をしていないか調べて見ましょう。
85
+
86
+ ----
87
+ 追記
88
+ 丁度最近、cv2.VideoCapture/tkinter での動作確認のために書いたコードがあったので、
89
+ 解説等は出来ませんが、参考になればと思い張っておきます。
90
+ https://repl.it/@MiKLTea/tkVideoCanvas#main.py
91
+
92
+ - update() 関数を、サブスレッド側(cv2) とメインスレッド(tkinter)に分離する場合の参考になると思います。
93
+ - プログラムの終了時にエラーが出る場合は、状況次第ですが、
94
+  リソースの解放順序を明示的にする必要があります。

2

関数名の修正

2020/11/25 07:24

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -45,14 +45,14 @@
45
45
 
46
46
  # POINT: 2回目以降の xrange は MainThread で実行されるのが確認できると思います
47
47
 
48
- def xrange(root):
48
+ def xfunc(root):
49
- logging.info("xrange")
49
+ logging.info("xfunc")
50
- root.after(1000, xrange, root)
50
+ root.after(1000, xfunc, root)
51
51
 
52
- def xrange2(root): # 別スレッドでの実行なら、1秒待つのには time.sleep が使えます
52
+ def xfunc2(root): # 別スレッドでの実行なら、1秒待つのには time.sleep が使えます
53
53
  import time
54
54
  while True:
55
- logging.info("xrange2")
55
+ logging.info("xfunc2")
56
56
  time.sleep(1)
57
57
 
58
58
  def main():

1

コード追記、スレッド内であれば1秒待つのに time.sleep を使う

2020/11/25 07:06

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -49,6 +49,12 @@
49
49
  logging.info("xrange")
50
50
  root.after(1000, xrange, root)
51
51
 
52
+ def xrange2(root): # 別スレッドでの実行なら、1秒待つのには time.sleep が使えます
53
+ import time
54
+ while True:
55
+ logging.info("xrange2")
56
+ time.sleep(1)
57
+
52
58
  def main():
53
59
  root = tk.Tk()
54
60
  button = tk.Button(root, text="Quit", command=root.quit)