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

回答編集履歴

3

現状のコードの問題点について追記

2021/12/10 07:28

投稿

teamikl
teamikl

スコア8817

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

説明補足

2021/12/10 07:28

投稿

teamikl
teamikl

スコア8817

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

説明補足

2021/12/08 04:29

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -27,4 +27,6 @@
27
27
 
28
28
  GUI が更新されるのはイベントループ内、PySimpleGUI の場合は window.read の内部です。
29
29
  明示的に更新する方法もありますが、サブスレッドからのGUIの直接操作自体を回避した方が良いです。
30
- 上述した方法で、「GUIの操作はメインスレッドからのみ」とすると、必然的に解消されるはずです。
30
+ 上述した方法で、「GUIの操作はメインスレッドからのみ」とすると、必然的に解消されるはずです。
31
+
32
+ ※ 厳密には、GUIのイベントループを動かしてるスレッドで。大抵の場合は、メインスレッド。