#coding: utf-8

#動画ファイルをFrameに表示する。Frameを閉じると停止する。

import wx
import numpy as np
import imageio

video_name = "test.mp4" #ここにヴィデオ・ファイル名を書く
video = imageio.get_reader(video_name)
gen = video.iter_data()


#フレームに画像を表示する
class myFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title)
        self.Bind(wx.EVT_CLOSE, self.frame_close)
        #フレームを閉じると発生するイヴェント
        self.stopFlag=False
        #第1フレームの読み込み(フレームサイズを決める
        try:
            image=gen.__next__()
        except: 
            self.Destroy()
        #配列データからwx.Imageへの変換
        self.wximage=wx.Image(image.shape[1], image.shape[0], image)
        bitmap =self.wximage.ConvertToBitmap()
        self.stbmp=wx.StaticBitmap(self, -1, bitmap, (0,0), self.GetClientSize())
        #ビットマップを表示
        self.SetSize(self.wximage.GetSize())
        #フレームの大きさを画像サイズに合わせる
        self.stream()
        

    def stream(self):
        def updateFrame():
            if self.stopFlag:
                return
            try:
                image=gen.__next__()
            except: 
                return
            self.wximage=wx.Image(image.shape[1], image.shape[0], image)
            bitmap =self.wximage.ConvertToBitmap()
            self.stbmp.SetBitmap(bitmap)
            #bitmapの再描画
            wx.CallLater(33, updateFrame) #フレーム・レートの調整
        updateFrame()
        

    def frame_close(self, event):
        #閉じたときに発生するイベントの処理
        self.stopFlag=True        
        wx.CallLater(100, self.Destroy)
        

def main():
    app = wx.App(False)
    frame = myFrame(None, "Display Video")
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()