回答編集履歴

4

実行可能なコードを追加

2020/04/26 23:31

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -73,3 +73,83 @@
73
73
 
74
74
 
75
75
  ![イメージ説明](07b674527e98d0a096aa1520c6476205.gif)
76
+
77
+
78
+
79
+
80
+
81
+ ----
82
+
83
+ 追記: コードを追加する場所が解り難かったと思うので、
84
+
85
+ 実行可能なコードを追加します。読み込む gif はカレントディレクトリが対象です。
86
+
87
+
88
+
89
+ ```python
90
+
91
+ import wx
92
+
93
+ import wx.adv
94
+
95
+
96
+
97
+
98
+
99
+ class MainWindow(wx.Frame):
100
+
101
+ def __init__(self, parent, id, title):
102
+
103
+ wx.Frame.__init__(self, parent, id, title, size=(400, 400))
104
+
105
+
106
+
107
+ self.ctrl = wx.adv.AnimationCtrl(self)
108
+
109
+ self.ctrl.Stop()
110
+
111
+
112
+
113
+ from glob import glob
114
+
115
+ from itertools import cycle
116
+
117
+ from functools import partial
118
+
119
+
120
+
121
+ getNextImageFile = partial(next, cycle(glob("*.gif")))
122
+
123
+
124
+
125
+ def showNextImage():
126
+
127
+ filepath = getNextImageFile()
128
+
129
+ self.ctrl.SetAnimation(wx.adv.Animation(filepath))
130
+
131
+ self.ctrl.Play()
132
+
133
+
134
+
135
+ wx.CallLater(1000*10, showNextImage)
136
+
137
+ showNextImage()
138
+
139
+
140
+
141
+
142
+
143
+ if __name__ == '__main__':
144
+
145
+ app = wx.App()
146
+
147
+ win = MainWindow(None, wx.ID_ANY, 'TOTO')
148
+
149
+ win.Centre()
150
+
151
+ win.Show()
152
+
153
+ app.MainLoop()
154
+
155
+ ```

3

コードの冗長な部分を修正 glob

2020/04/26 23:31

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -32,13 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- def enumFileList():
36
-
37
- yield from glob("*.gif")
38
-
39
-
40
-
41
- getNextImageFile = partial(next, cycle(enumFileList()))
35
+ getNextImageFile = partial(next, cycle(glob("*.gif")))
42
36
 
43
37
 
44
38
 
@@ -47,8 +41,6 @@
47
41
 
48
42
 
49
43
  # 上記は、カレントディレクトリ内の gif ファイルを繰り返す例
50
-
51
- # ファイルリストを返すジェネレータとして実装すると、
52
44
 
53
45
  # next() で次の要素を取り出せるので、上のように定義が出来ます。
54
46
 

2

コード修正。

2020/04/26 16:09

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -60,15 +60,17 @@
60
60
 
61
61
  filepath = getNextImageFile()
62
62
 
63
+ # NOTE: self.ctrl は wx.adv.AnimationCtrlのインスタンス。適切なスコープにおいてください。
64
+
63
65
  self.ctrl.SetAnimation(wx.adv.Animation(filepath))
64
66
 
65
67
  self.ctrl.Play()
66
68
 
69
+ wx.CallLater(1000*10, showNextImage)
67
70
 
68
71
 
69
- # NOTE: self.ctrl は wx.adv.AnimationCtrlのインスタンス
70
72
 
71
- wx.CallLater(1000*10, showNextImage)
73
+ showNextImage()
72
74
 
73
75
  ```
74
76
 

1

サンプルコードとデモを追加

2020/04/26 16:06

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -10,4 +10,72 @@
10
10
 
11
11
  もしスレッドで実装する場合は、自分で作成したスレッド側ではデータ変更や通知のみに留め、
12
12
 
13
- 描画はメインループに委ねるようにします。(コードは今から拝見します)
13
+ 描画はメインループに委ねるようにします。~~(コードは今から拝見します)~~
14
+
15
+
16
+
17
+ ----
18
+
19
+ CallLater利用周りのみになりますが、該当部分周辺のコードとデモ。
20
+
21
+ スレッドやキューは不要になります。
22
+
23
+
24
+
25
+ ```python
26
+
27
+ from glob import glob
28
+
29
+ from itertools import cycle
30
+
31
+ from functools import partial
32
+
33
+
34
+
35
+ def enumFileList():
36
+
37
+ yield from glob("*.gif")
38
+
39
+
40
+
41
+ getNextImageFile = partial(next, cycle(enumFileList()))
42
+
43
+
44
+
45
+ # getNextImageFile 関数は用途に合わせて実装してください。
46
+
47
+
48
+
49
+ # 上記は、カレントディレクトリ内の gif ファイルを繰り返す例
50
+
51
+ # ファイルリストを返すジェネレータとして実装すると、
52
+
53
+ # next() で次の要素を取り出せるので、上のように定義が出来ます。
54
+
55
+ # itertools.cycle で末尾まで到達すると、次は先頭から繰り返します。
56
+
57
+
58
+
59
+ def showNextImage():
60
+
61
+ filepath = getNextImageFile()
62
+
63
+ self.ctrl.SetAnimation(wx.adv.Animation(filepath))
64
+
65
+ self.ctrl.Play()
66
+
67
+
68
+
69
+ # NOTE: self.ctrl は wx.adv.AnimationCtrlのインスタンス
70
+
71
+ wx.CallLater(1000*10, showNextImage)
72
+
73
+ ```
74
+
75
+
76
+
77
+ デモ用(3秒切り替え)
78
+
79
+
80
+
81
+ ![イメージ説明](07b674527e98d0a096aa1520c6476205.gif)