以前質問させて頂いたあとの別のやりかたの質問をさせて下さい。
https://teratail.com/questions/256690#reply-369648
前提・実現したいこと
wxpythonでgif動画を再生するデスクトップアプリを作っています。
10秒後(不確定な第三者の反応に応じた後<例えばメール受信等々>)にgif動画を切り替えたい。
Architectureと発生している問題・エラーメッセージ
<方法1>
wxpythonのmain部分に動画再生メソッドと、チェック機能(例えばwhileで常に第三者の反応をチェックするメソッド)をmainに一緒に置いてしまうと、main側の動画再生ができませんでした。
python
1# coding:utf-8 2import os 3import sys 4import time 5import cv2 6import numpy as np 7import wx.adv 8import time 9 10import os 11import wx 12class MainWindow(wx.Frame): 13 # def __init__(self): 14 def __init__(self, parent, id, title): 15 wx.Frame.__init__(self, parent, id, title, size=(700, 600)) 16 17 self.ctrl = wx.adv.AnimationCtrl(self) 18 self.ctrl.Stop() 19 20 from glob import glob 21 from itertools import cycle 22 from functools import partial 23 24 def showNextImage(): 25 filepath = 'someiyoshino1.gif' 26 print(filepath) 27 self.ctrl.SetAnimation(wx.adv.Animation(filepath)) 28 self.ctrl.Play() 29 30 def showNextImage2(): 31 filepath = 'someiyoshino2.gif' 32 print(filepath) 33 self.ctrl.SetAnimation(wx.adv.Animation(filepath)) 34 self.ctrl.Play() 35 36 count = 0 37 # 第三者アクション ボタン押下などではなく(メール受信など予測が難しいタイミング等) 38 # フラグが立った時に動画を再生や切り替えを行いたい。 39 while True: 40 count += 1 41 print(count) 42 if(count == 10): 43 showNextImage2() 44 time.sleep(1) 45 46 47 48from multiprocessing import Process, Value 49import time 50 51def main(a:Value): 52 print("mainスタート") 53 app = wx.App() 54 win = MainWindow(None, wx.ID_ANY, 'TOTO') 55 win.Centre() 56 win.Show() 57 app.MainLoop() 58 59def func1(a: Value): 60 print("[func1]スタート") 61 while True: 62 if(a.Value == 1): 63 wx.CallLater(1000*1, self.showNextImage) 64 65 66if __name__ == "__main__": 67 68 a = Value('d', 0) 69 70 func0_proc = Process(target=main, args=(a,)) 71 func1_proc = Process(target=func1, args=(a,)) 72 73 func0_proc.start() 74 func1_proc.start() 75 76 func0_proc.join() 77 func1_proc.join() 78 79 print(a.value)
<方法2>
あらかじめ同じメモリ内にa.Valueの変数を作り、wxpythonのmain部分に動画再生メソッドを置き、チェック機能(例えばwhileで常に第三者の反応をチェックするメソッド)を別のスレッドにして並行稼働してチェックし、一定条件でa.Valueを変化させ、mainスレッドでa.Valueの変化を察知してCallLaterで同main内の動画再生メソッド呼び出しを行いましたが、実行されませんでした。
ソースコードは以下です。
python
1# coding:utf-8 2import os 3import sys 4import time 5import cv2 6import numpy as np 7import wx.adv 8import time 9import os 10import wx 11choose_text_h5 = "" 12 13class MainWindow(wx.Frame): 14 # def __init__(self): 15 def __init__(self, parent, id, title): 16 wx.Frame.__init__(self, parent, id, title, size=(700, 600)) 17 18 self.ctrl = wx.adv.AnimationCtrl(self) 19 self.ctrl.Stop() 20 21 from glob import glob 22 from itertools import cycle 23 from functools import partial 24 25 def showNextImage(): 26 filepath = 'someiyoshino1.gif' 27 print(filepath) 28 self.ctrl.SetAnimation(wx.adv.Animation(filepath)) 29 self.ctrl.Play() 30 31 def showNextImage2(): 32 filepath = 'someiyoshino2.gif' 33 print(filepath) 34 self.ctrl.SetAnimation(wx.adv.Animation(filepath)) 35 self.ctrl.Play() 36 37 if(a.Value == 1): 38 wx.CallLater(1000*1, showNextImage) 39 40 41from multiprocessing import Process, Value 42import time 43 44def main(a:Value): 45 print("mainスタート") 46 # app = wx.App(False) 47 # Main().Show(True) 48 # app.MainLoop() 49 app = wx.App() 50 win = MainWindow(None, wx.ID_ANY, 'TOTO') 51 win.Centre() 52 win.Show() 53 app.MainLoop() 54 55def func1(a: Value): 56 print("[func1]スタート") 57 58 count = 0 59 while True: 60 count += 1 61 print(count) 62 if(count == 10): 63 a.Value = 1 64 time.sleep(1) 65 print(a.value) 66 67def func2(self, a: Value): 68 print("[func2]スタート") 69 # while True: 70 # if(a.Value == 1): 71 # wx.CallLater(1000*1, self.showNextImage) 72 73if __name__ == "__main__": 74 75 a = Value('d', 0) 76 77 func0_proc = Process(target=main, args=(a,)) 78 func1_proc = Process(target=func1, args=(a,)) 79 func2_proc = Process(target=func2, args=(a,)) 80 81 func0_proc.start() 82 func1_proc.start() 83 func2_proc.start() 84 85 func0_proc.join() 86 func1_proc.join() 87 func2_proc.join() 88 print(a.value)
<方法3>
あらかじめ同じメモリ内にa.Valueの変数を作り、wxpythonのmain部分に動画再生メソッドを置き、チェック機能(例えばwhileで常に第三者の反応をチェックするメソッド)を別のスレッドにして並行稼働してチェックし、一定条件でa.Valueを変化させ、3つ目のスレッドでa.Valueの変化を察知してmain側に対してCallLaterでメソッド呼び出しを行いましたが、実行されませんでした。
python
1# coding:utf-8 2import os 3import sys 4import time 5import cv2 6import numpy as np 7import wx.adv 8import time 9import os 10import wx 11choose_text_h5 = "" 12 13class MainWindow(wx.Frame): 14 def __init__(self, parent, id, title): 15 wx.Frame.__init__(self, parent, id, title, size=(700, 600)) 16 17 self.ctrl = wx.adv.AnimationCtrl(self) 18 self.ctrl.Stop() 19 20 from glob import glob 21 from itertools import cycle 22 from functools import partial 23 24 self.MainPanel = wx.Panel(self, size=(1300, 900))#メイン画面の大きさ 25 26 def showNextImage(): 27 filepath = 'someiyoshino1.gif' 28 print(filepath) 29 self.ctrl.SetAnimation(wx.adv.Animation(filepath)) 30 self.ctrl.Play() 31 32 def showNextImage2(): 33 filepath = 'someiyoshino2.gif' 34 print(filepath) 35 self.ctrl.SetAnimation(wx.adv.Animation(filepath)) 36 self.ctrl.Play() 37 38from multiprocessing import Process, Value 39import time 40 41def main(): 42 print("mainスタート") 43 # app = wx.App(False) 44 # Main().Show(True) 45 # app.MainLoop() 46 app = wx.App() 47 win = MainWindow(None, wx.ID_ANY, 'TOTO') 48 win.Centre() 49 win.Show() 50 app.MainLoop() 51 52def func1(self): 53 print("[func1]スタート") 54 55 count = 0 56 while True: 57 count += 1 58 print(count) 59 if(count == 10): 60 wx.CallLater(1000*1, self.showNextImage) 61 time.sleep(1) 62 63if __name__ == "__main__": 64 65 # a = Value('d', 0) 66 67 func0_proc = Process(target=main) 68 func1_proc = Process(target=func1) 69 70 func0_proc.start() 71 func1_proc.start() 72 73 func0_proc.join() 74 func1_proc.join() 75 print(a.value)
<方法4>
動画再生側をmain側ではなく、別のメソッドとして外部に配置する方法を試みようとしましたが、外部メソッド実行じたいができませんでした。
python
1import wx 2import wx.adv 3 4from glob import glob 5from itertools import cycle 6from functools import partial 7 8def showNextImage(): 9 filepath = 'someiyoshino1.gif' 10 print(filepath) 11 wx.adv.AnimationCtrl.SetAnimation(wx.adv.Animation(filepath)) 12 wx.adv.AnimationCtrl.Play() 13showNextImage() 14
方法1~4まで全て試したのですが、うまくいきませんでした。
任意のフラグによって動画を差し替えたり再生したりなどはどのように行えばよいのでしょうか。
よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
win10
python3.7
wxpython
参考サイト
https://teratail.com/questions/158458
https://teratail.com/questions/233764
https://qiita.com/wikipediia/items/2919362de582a7d8de9e
https://www.python-beginners.com/entry/20191125/1574687207
https://qiita.com/asakbiz/items/5a34cae7b6c00c87a7e6
https://dev.classmethod.jp/articles/python-asyncio/
https://www.rhoboro.com/2019/02/09/coroutine-abstract.html
https://qiita.com/satsukiya/items/f7a3c7fdae566ed96306
https://www.yoheim.net/blog.php?q=20170601
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/28 09:35
2020/04/28 11:39
2020/04/28 13:08