回答編集履歴

5

他の解決策について追記

2022/12/10 11:13

投稿

teamikl
teamikl

スコア8679

test CHANGED
@@ -15,6 +15,9 @@
15
15
  解決策
16
16
  GUI操作でバックグラウンドで処理を行いたい場合は
17
17
  GUIライブラリの提供するタイマー機能(tkinter では afterメソッド)を使いましょう。
18
+
19
+ 追記
20
+ 他の解決策で、今回の用途であれば、`<Motion>`イベントも使えます。
18
21
 
19
22
  ----
20
23
  他、GUI等のイベント駆動型プログラムでの禁止項目

4

間違いではないので、取り消し線を解除

2022/12/10 08:32

投稿

teamikl
teamikl

スコア8679

test CHANGED
@@ -2,7 +2,7 @@
2
2
  GUIへのアクセスは、基本、メインスレッド側でしか行ってはいけません。
3
3
  複数スレッドからの同時アクセスにより、意図しない挙動になることがあります。
4
4
 
5
- ~~毎回止まっているところは、time.sleep です。~~
5
+ 毎回止まっているところは、time.sleep です。
6
6
  sleepによりスレッドの切り替えが発生する為。
7
7
  他は数ms しか掛からない処理で、 200ms をsleepで待機しているので
8
8
  止まりやすい位置ではあります。ただし保証された挙動ではありません。

3

エラー内容に関して説明補足

2022/12/10 08:31

投稿

teamikl
teamikl

スコア8679

test CHANGED
@@ -2,10 +2,15 @@
2
2
  GUIへのアクセスは、基本、メインスレッド側でしか行ってはいけません。
3
3
  複数スレッドからの同時アクセスにより、意図しない挙動になることがあります。
4
4
 
5
- 毎回止まっているところは、time.sleep です。
5
+ ~~毎回止まっているところは、time.sleep です。~~
6
6
  sleepによりスレッドの切り替えが発生する為。
7
7
  他は数ms しか掛からない処理で、 200ms をsleepで待機しているので
8
8
  止まりやすい位置ではあります。ただし保証された挙動ではありません。
9
+
10
+ 追記: 質問の意図が、エラーで止まってる方だとすれば、説明補足で
11
+ self.posy1 は、メインスレッド側で thread.join() 後に None になるため。
12
+ 毎回そこのエラーが発生する理由は上述の通りです。
13
+
9
14
 
10
15
  解決策
11
16
  GUI操作でバックグラウンドで処理を行いたい場合は

2

タイマー内でのループについて補足

2022/12/10 08:27

投稿

teamikl
teamikl

スコア8679

test CHANGED
@@ -26,6 +26,11 @@
26
26
  今回のコードでは、thead.join() スレッドの終了を待ちますが
27
27
  別スレッド側では time.sleep しているので最長 200 + α ms の間イベントループが止まります。
28
28
 
29
+ GUIライブラリの提供するタイマー機能を使えば、
30
+ イベントループ内でタイマー・イベントとして割り込むことができるので、
31
+ イベントループを止めることなく、バックグラウンドで処理ということができます。
32
+ ただし、タイマー内でループ処理を行いたい場合などは少し工夫が必要です。
33
+
29
34
  無理やりマルチスレッドで動かすなら
30
35
  (おすすめはしませんが、問題点の把握と症状が解消することの確認の為)
31
36
  - スレッドを daemonスレッドにする → 終了時に確実に破棄する為

1

文章校正

2022/12/10 08:18

投稿

teamikl
teamikl

スコア8679

test CHANGED
@@ -7,6 +7,7 @@
7
7
  他は数ms しか掛からない処理で、 200ms をsleepで待機しているので
8
8
  止まりやすい位置ではあります。ただし保証された挙動ではありません。
9
9
 
10
+ 解決策
10
11
  GUI操作でバックグラウンドで処理を行いたい場合は
11
12
  GUIライブラリの提供するタイマー機能(tkinter では afterメソッド)を使いましょう。
12
13