#coding: utf-8

#ヴィデオをFrameに表示する。Frameを閉じると停止する。

import wx
import numpy as np
import cv2

cap = cv2.VideoCapture(0)


#フレームに画像を表示する
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フレームの読み込み(フレームサイズを決める
        ret, image = cap.read()
        image = cv2.flip(image, 1)
        cv2image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        #配列データからwx.Imageへの変換
        self.wximage=wx.Image(cv2image.shape[1], cv2image.shape[0], cv2image)
        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
            ret, image = cap.read()
            image = cv2.flip(image, 1)
            cv2image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            self.wximage=wx.Image(cv2image.shape[1], cv2image.shape[0], cv2image)
            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()