回答編集履歴
3
現状のコードの問題点について追記
answer
CHANGED
@@ -24,6 +24,7 @@
|
|
24
24
|
|
25
25
|
- [PySimpleGUI Demo: Desktop Widget Timer](https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Desktop_Widget_Timer.py)
|
26
26
|
|
27
|
+
|
27
28
|
----
|
28
29
|
> 当初、play_animeメソッド内で windowのupdateをいくらしても、windowsが更新されないのであれば、意味がないのだと思い、この更新メソッドを一番下に記載しました。
|
29
30
|
|
@@ -31,4 +32,18 @@
|
|
31
32
|
明示的に更新する方法もありますが、サブスレッドからのGUIの直接操作自体を回避した方が良いです。
|
32
33
|
上述した方法で、「GUIの操作はメインスレッドからのみ」とすると、必然的に解消されるはずです。
|
33
34
|
|
34
|
-
※ 厳密には、GUIのイベントループを動かしてるスレッドで。大抵の場合は、メインスレッド。
|
35
|
+
※ 厳密には、GUIのイベントループを動かしてるスレッドで。大抵の場合は、メインスレッド。
|
36
|
+
|
37
|
+
|
38
|
+
----
|
39
|
+
追記: 他の問題点
|
40
|
+
|
41
|
+
- `def play_anim(self):` ... この関数はトップレベルで宣言されてます、
|
42
|
+
クラス内ではないのでメソッドを想定した使いかたは出来ません。
|
43
|
+
- args=[DATA] ... 呼び出される側の関数で想定されてる値と異なります。
|
44
|
+
- thread.join ... join はスレッドの終了を待ちます。
|
45
|
+
イベントループ内で使うと、イベントループは停止しスレッド側に処理が移るので、
|
46
|
+
GUIイベントが処理されない → ウィンドウが応答なしの原因になります。
|
47
|
+
|
48
|
+
現状のコードの問題点ですが、スレッドの利用方法から見直す必要があるので、
|
49
|
+
エラーを修正して期待通りに動くとはいきません。
|
2
説明補足
answer
CHANGED
@@ -16,10 +16,12 @@
|
|
16
16
|
PySimpleGUIのバックエンドがtkinterの場合は、別スレッドからの操作でも大丈夫なことも有りますが、
|
17
17
|
意図しない挙動になることもある為、お勧めしません。他のGUIライブラリでは大抵エラーです。
|
18
18
|
|
19
|
-
解消法としては、上記のサンプルの様に
|
19
|
+
解消法としては、(追記・補足: スレッドを使う場合は) 上記のサンプルの様に
|
20
20
|
サブスレッドからは通知のみを行い、メインスレッド側でGUI関連の処理が行われるような構成にして下さい。
|
21
|
-
サブスレッド側で行う処理が、時間の掛かる処理でない場合は、タイマーイベントを使う方法もあります
|
22
21
|
|
22
|
+
他の案で、サブスレッド側で行う処理が時間の掛かる処理でない場合は、タイマーイベントを使う方法もあります。
|
23
|
+
処理内容次第ですが、用途がアニメーションのみであれば、タイマーの方が適切な場合もあり。
|
24
|
+
|
23
25
|
- [PySimpleGUI Demo: Desktop Widget Timer](https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Desktop_Widget_Timer.py)
|
24
26
|
|
25
27
|
----
|
1
説明補足
answer
CHANGED
@@ -27,4 +27,6 @@
|
|
27
27
|
|
28
28
|
GUI が更新されるのはイベントループ内、PySimpleGUI の場合は window.read の内部です。
|
29
29
|
明示的に更新する方法もありますが、サブスレッドからのGUIの直接操作自体を回避した方が良いです。
|
30
|
-
上述した方法で、「GUIの操作はメインスレッドからのみ」とすると、必然的に解消されるはずです。
|
30
|
+
上述した方法で、「GUIの操作はメインスレッドからのみ」とすると、必然的に解消されるはずです。
|
31
|
+
|
32
|
+
※ 厳密には、GUIのイベントループを動かしてるスレッドで。大抵の場合は、メインスレッド。
|