回答編集履歴
4
コード修正
answer
CHANGED
@@ -43,7 +43,7 @@
|
|
43
43
|
from threading import Thread
|
44
44
|
import logging
|
45
45
|
|
46
|
-
# POINT: 2回目以降の
|
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=
|
63
|
+
thread = Thread(target=xfunc, args=(root,), daemon=True)
|
64
64
|
thread.start()
|
65
65
|
|
66
66
|
root.mainloop()
|
3
追記: サンプルコードに関して
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
関数名の修正
answer
CHANGED
@@ -45,14 +45,14 @@
|
|
45
45
|
|
46
46
|
# POINT: 2回目以降の xrange は MainThread で実行されるのが確認できると思います
|
47
47
|
|
48
|
-
def
|
48
|
+
def xfunc(root):
|
49
|
-
logging.info("
|
49
|
+
logging.info("xfunc")
|
50
|
-
root.after(1000,
|
50
|
+
root.after(1000, xfunc, root)
|
51
51
|
|
52
|
-
def
|
52
|
+
def xfunc2(root): # 別スレッドでの実行なら、1秒待つのには time.sleep が使えます
|
53
53
|
import time
|
54
54
|
while True:
|
55
|
-
logging.info("
|
55
|
+
logging.info("xfunc2")
|
56
56
|
time.sleep(1)
|
57
57
|
|
58
58
|
def main():
|
1
コード追記、スレッド内であれば1秒待つのに time.sleep を使う
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)
|