root/trunk/wxglvideo/motmot/wxglvideo/demo.py

Revision 592, 5.2 kB (checked in by astraw, 9 months ago)

Reduce update rate to 20 Hz in demo

Line 
1 import wx
2 import wx.xrc as xrc
3 import pkg_resources
4 import numpy
5
6 from pygarrayimage.arrayimage import ArrayInterfaceImage
7
8 import motmot.wxglvideo.wxglvideo as vid
9
10 RESFILE = pkg_resources.resource_filename(__name__,"demo.xrc") # trigger extraction
11
12 RES = xrc.EmptyXmlResource()
13 RES.LoadFromString(open(RESFILE).read())
14
15 SIZE = 32,32,3
16
17 class DemoApp(wx.App):
18
19     def OnInit(self,*args,**kw):
20         wx.InitAllImageHandlers()
21
22         self.frame = RES.LoadFrame(None,"DEMO_FRAME") # make frame main panel
23         self.frame.Show()
24
25         self.target_panel = xrc.XRCCTRL(self.frame,"TARGET_PANEL")
26         self.target_box = wx.BoxSizer(wx.HORIZONTAL)
27         self.target_panel.SetSizer(self.target_box)
28
29         ctrl = xrc.XRCCTRL(self.frame,"ADD_DISPLAY")
30         wx.EVT_BUTTON(ctrl, ctrl.GetId(), self.OnAddDisplay)
31
32         wx.EVT_CLOSE(self.frame, self.OnWindowClose)
33
34         self.gl_canvases = []
35         self.next_canvas_id = 0
36         ID_Timer = wx.NewId()
37         self.timer = wx.Timer(self, ID_Timer)
38         wx.EVT_TIMER(self, ID_Timer, self.OnTimer)
39         self.update_interval=50 # msec
40         self.timer.Start(self.update_interval)
41
42         self.widgets2canv = {}
43         self.panels_by_canvas = {}
44
45         return True
46
47     def OnWindowClose(self,event):
48         self.timer.Stop()
49         event.Skip()
50
51     def OnAddDisplay(self,event):
52         new_panel = RES.LoadPanel(self.target_panel,"DEMO_PANEL")
53
54         self.target_box.Add( new_panel, 1, wx.EXPAND )
55
56         main_display_panel = xrc.XRCCTRL(new_panel, "MAIN_DISPLAY_PANEL")
57         box = wx.BoxSizer(wx.VERTICAL)
58         main_display_panel.SetSizer(box)
59
60         # The Hide()/Show() pair prevent a gtk_widget_set_colormap()
61         # GTK_WIDGET_REALIZED warning.
62
63         main_display_panel.Hide()
64         try:
65             gl_canvas = vid.DynamicImageCanvas(main_display_panel,-1)
66         finally:
67             main_display_panel.Show()
68
69         self.panels_by_canvas[gl_canvas] = new_panel
70
71         box.Add(gl_canvas,1,wx.EXPAND)
72
73         self.target_panel.Layout()
74
75         ctrl = xrc.XRCCTRL(new_panel,"FLIPLR")
76         self.widgets2canv[ctrl]=gl_canvas
77         wx.EVT_CHECKBOX(ctrl, ctrl.GetId(), self.OnFlipLR)
78         gl_canvas.set_flip_lr(ctrl.IsChecked())
79
80         ctrl = xrc.XRCCTRL(new_panel,"ROTATE180")
81         self.widgets2canv[ctrl]=gl_canvas
82         wx.EVT_CHECKBOX(ctrl, ctrl.GetId(), self.OnRotate180)
83         gl_canvas.set_rotate_180(ctrl.IsChecked())
84
85         ctrl = xrc.XRCCTRL(new_panel,"FULLCANVAS")
86         self.widgets2canv[ctrl]=gl_canvas
87         wx.EVT_CHECKBOX(ctrl, ctrl.GetId(), self.OnFullcanvas)
88         gl_canvas.set_fullcanvas(ctrl.IsChecked())
89
90         Color = xrc.XRCCTRL(new_panel,"COLOR")
91         self.widgets2canv[Color]=gl_canvas
92         Which = xrc.XRCCTRL(new_panel,"WHICH")
93         self.widgets2canv[Which]=gl_canvas
94
95         ctrl = xrc.XRCCTRL(new_panel,"CLOSE")
96         self.widgets2canv[ctrl]=gl_canvas
97         wx.EVT_BUTTON(ctrl, ctrl.GetId(), self.OnClose)
98
99         canvas_id = self.next_canvas_id
100         gl_canvas.canvas_id = canvas_id
101         self.next_canvas_id += 1
102         self.gl_canvases.append( (gl_canvas, Color, Which) )
103
104         ni = numpy.random.uniform( 0, 255, SIZE).astype(numpy.uint8)
105         pygim = ArrayInterfaceImage(ni,allow_copy=False)
106         gl_canvas.new_image(pygim)
107
108     def _event2canvas(self,event):
109         widget = event.GetEventObject()
110         gl_canvas = self.widgets2canv[widget]
111         return gl_canvas
112
113     def OnFlipLR(self,event):
114         gl_canvas = self._event2canvas(event)
115         gl_canvas.set_flip_lr(event.GetEventObject().IsChecked())
116
117     def OnRotate180(self,event):
118         gl_canvas = self._event2canvas(event)
119         gl_canvas.set_rotate_180(event.GetEventObject().IsChecked())
120
121     def OnFullcanvas(self,event):
122         gl_canvas = self._event2canvas(event)
123         gl_canvas.set_fullcanvas(event.GetEventObject().IsChecked())
124
125     def OnClose(self,event):
126         gl_canvas = self._event2canvas(event)
127         for idx in range(len(self.gl_canvases)):
128             if self.gl_canvases[idx][0] == gl_canvas:
129                 break
130
131         del self.gl_canvases[idx]
132
133         panel = self.panels_by_canvas[gl_canvas]
134         panel.DestroyChildren()
135         panel.Destroy()
136         self.target_panel.Layout()
137
138     def OnTimer(self, event):
139         for (gl_canvas,Color,Which) in self.gl_canvases:
140             my_numpy_array = numpy.random.uniform( 0, 255, SIZE).astype(numpy.uint8)
141             color = Color.GetStringSelection()
142             if color==u'red':
143                 my_numpy_array[:,:,1:]=0 # make red
144             elif color==u'multi':
145                 pass
146             else:
147                 raise ValueError('')
148
149             which = Which.GetStringSelection()
150             if which==u'bottom':
151                 my_numpy_array[5:,:,:]=0 # make only bottom pixels displayed
152             elif which==u'left':
153                 my_numpy_array[:,5:,:]=0 # make only bottom pixels displayed
154             elif which==u'all':
155                 pass
156             else:
157                 raise ValueError('')
158
159             gl_canvas.update_image( my_numpy_array )
160
161 def main():
162     import os
163     if int(os.environ.get('NO_REDIRECT','0')):
164         kw = {}
165     else:
166         kw = dict(redirect=True,filename='demo.log')
167     app = DemoApp(**kw)
168     app.MainLoop()
169
170 if __name__=='__main__':
171     main()
172
Note: See TracBrowser for help on using the browser.