回答編集履歴
5
他の解決策について追記
    
        answer	
    CHANGED
    
    | @@ -16,6 +16,9 @@ | |
| 16 16 | 
             
            GUI操作でバックグラウンドで処理を行いたい場合は
         | 
| 17 17 | 
             
            GUIライブラリの提供するタイマー機能(tkinter では afterメソッド)を使いましょう。 
         | 
| 18 18 |  | 
| 19 | 
            +
            追記
         | 
| 20 | 
            +
            他の解決策で、今回の用途であれば、`<Motion>`イベントも使えます。
         | 
| 21 | 
            +
             | 
| 19 22 | 
             
            ----
         | 
| 20 23 | 
             
            他、GUI等のイベント駆動型プログラムでの禁止項目
         | 
| 21 24 | 
             
            イベントハンドラ内での時間のかかる処理。thread.join() 等。
         | 
4
間違いではないので、取り消し線を解除
    
        answer	
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
            GUIへのアクセスは、基本、メインスレッド側でしか行ってはいけません。
         | 
| 3 3 | 
             
            複数スレッドからの同時アクセスにより、意図しない挙動になることがあります。
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 5 | 
            +
            毎回止まっているところは、time.sleep です。
         | 
| 6 6 | 
             
            sleepによりスレッドの切り替えが発生する為。
         | 
| 7 7 | 
             
            他は数ms しか掛からない処理で、 200ms をsleepで待機しているので
         | 
| 8 8 | 
             
            止まりやすい位置ではあります。ただし保証された挙動ではありません。
         | 
3
エラー内容に関して説明補足
    
        answer	
    CHANGED
    
    | @@ -2,11 +2,16 @@ | |
| 2 2 | 
             
            GUIへのアクセスは、基本、メインスレッド側でしか行ってはいけません。
         | 
| 3 3 | 
             
            複数スレッドからの同時アクセスにより、意図しない挙動になることがあります。
         | 
| 4 4 |  | 
| 5 | 
            -
            毎回止まっているところは、time.sleep です。
         | 
| 5 | 
            +
            ~~毎回止まっているところは、time.sleep です。~~
         | 
| 6 6 | 
             
            sleepによりスレッドの切り替えが発生する為。
         | 
| 7 7 | 
             
            他は数ms しか掛からない処理で、 200ms をsleepで待機しているので
         | 
| 8 8 | 
             
            止まりやすい位置ではあります。ただし保証された挙動ではありません。
         | 
| 9 9 |  | 
| 10 | 
            +
            追記: 質問の意図が、エラーで止まってる方だとすれば、説明補足で
         | 
| 11 | 
            +
            self.posy1 は、メインスレッド側で thread.join() 後に None になるため。
         | 
| 12 | 
            +
            毎回そこのエラーが発生する理由は上述の通りです。
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 10 15 | 
             
            解決策
         | 
| 11 16 | 
             
            GUI操作でバックグラウンドで処理を行いたい場合は
         | 
| 12 17 | 
             
            GUIライブラリの提供するタイマー機能(tkinter では afterメソッド)を使いましょう。 
         | 
2
タイマー内でのループについて補足
    
        answer	
    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
文章校正
    
        answer	
    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 |  | 
