diff --git a/ivolution/data/media/icons/0_Readme_First.txt b/ivolution/data/media/icons/0_Readme_First.txt new file mode 100644 index 0000000..da15172 --- /dev/null +++ b/ivolution/data/media/icons/0_Readme_First.txt @@ -0,0 +1,29 @@ + + +Function Free Icon Set + +--- + +http://www.wefunction.com + +--- + +This Set was brought to you by Function +Design & Development Studio. + +Make sure you share these Icons using this +link only: + +http://www.wefunction.com/function-free-icon-set + +--- + +We're looking for New Clients for Web Design & Blog +Design Projects, we build and design fully unique +design & development solutions + +--- + +contact: liam@wefunction.com + +Website: www.wefunction.com \ No newline at end of file diff --git a/ivolution/data/media/icons/accepted_48.png b/ivolution/data/media/icons/accepted_48.png new file mode 100644 index 0000000..ac92115 Binary files /dev/null and b/ivolution/data/media/icons/accepted_48.png differ diff --git a/ivolution/data/media/icons/cancel_48.png b/ivolution/data/media/icons/cancel_48.png new file mode 100644 index 0000000..f60c9ed Binary files /dev/null and b/ivolution/data/media/icons/cancel_48.png differ diff --git a/ivolution/data/media/icons/folder_add_48.png b/ivolution/data/media/icons/folder_add_48.png new file mode 100644 index 0000000..5f50ed9 Binary files /dev/null and b/ivolution/data/media/icons/folder_add_48.png differ diff --git a/ivolution/data/media/icons/spanner_48.png b/ivolution/data/media/icons/spanner_48.png new file mode 100644 index 0000000..da40555 Binary files /dev/null and b/ivolution/data/media/icons/spanner_48.png differ diff --git a/ivolution/gui_wx/IvolutionTemplate.py b/ivolution/gui_wx/IvolutionTemplate.py index 0fdb7ae..d4aaea2 100644 --- a/ivolution/gui_wx/IvolutionTemplate.py +++ b/ivolution/gui_wx/IvolutionTemplate.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- ########################################################################### ## Python code generated with wxFormBuilder (version Jun 30 2011) @@ -9,266 +9,129 @@ import wx import wx.xrc +import wx.aui + +inputid = 1000 +settingsid = 1001 +startid = 1002 +stopid = 1003 +helpid = 1004 ########################################################################### ## Class IvolutionTemplate ########################################################################### class IvolutionTemplate ( wx.Frame ): - - def __init__( self, parent ): - wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Ivolution", pos = wx.DefaultPosition, size = wx.Size( 250,620 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) - - self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) - - maingrid = wx.FlexGridSizer( 3, 1, 0, 0 ) - maingrid.SetFlexibleDirection( wx.BOTH ) - maingrid.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - titlelayout = wx.BoxSizer( wx.HORIZONTAL ) - - titlelayout.SetMinSize( wx.Size( 50,50 ) ) - logobox = wx.BoxSizer( wx.VERTICAL ) - - logobox.SetMinSize( wx.Size( 50,50 ) ) - self.logo = wx.StaticBitmap( self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 50,50 ), 0 ) - logobox.Add( self.logo, 1, wx.ALL, 5 ) - - titlelayout.Add( logobox, 1, wx.FIXED_MINSIZE, 5 ) - - self.title = wx.StaticText( self, wx.ID_ANY, u"Ivolution", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE|wx.ALIGN_LEFT ) - self.title.Wrap( -1 ) - self.title.SetFont( wx.Font( 16, 71, 90, 92, False, wx.EmptyString ) ) - - titlelayout.Add( self.title, 3, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 5 ) - - maingrid.Add( titlelayout, 1, wx.EXPAND, 5 ) - - settingsbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - settingsbox.SetFlexibleDirection( wx.BOTH ) - settingsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - requiredbox = wx.FlexGridSizer( 3, 1, 0, 0 ) - requiredbox.SetFlexibleDirection( wx.BOTH ) - requiredbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.title = wx.StaticText( self, wx.ID_ANY, u"Required parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.title.Wrap( -1 ) - self.title.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) - - requiredbox.Add( self.title, 0, wx.ALL, 5 ) - - inputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - inputbox.SetFlexibleDirection( wx.BOTH ) - inputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.inputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your input folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.inputtitle.Wrap( -1 ) - inputbox.Add( self.inputtitle, 0, wx.ALL, 5 ) - - inputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) - inputchooserbox.SetFlexibleDirection( wx.BOTH ) - inputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.inputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) - inputchooserbox.Add( self.inputchooserbutton, 1, wx.ALL, 5 ) - - self.inputtextbox = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Documents/Ivolutionnnn", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.inputtextbox.Wrap( -1 ) - inputchooserbox.Add( self.inputtextbox, 0, wx.ALL, 5 ) - - inputbox.Add( inputchooserbox, 1, wx.EXPAND, 5 ) - - requiredbox.Add( inputbox, 1, wx.EXPAND, 5 ) - - outputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - outputbox.SetFlexibleDirection( wx.BOTH ) - outputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.outputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your output folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.outputtitle.Wrap( -1 ) - outputbox.Add( self.outputtitle, 0, wx.ALL, 5 ) - - outputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) - outputchooserbox.SetFlexibleDirection( wx.BOTH ) - outputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.outputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) - outputchooserbox.Add( self.outputchooserbutton, 0, wx.ALL, 5 ) - - self.outputchoosertext = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Videos", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.outputchoosertext.Wrap( -1 ) - outputchooserbox.Add( self.outputchoosertext, 0, wx.ALL, 5 ) - - outputbox.Add( outputchooserbox, 1, wx.EXPAND, 5 ) - - requiredbox.Add( outputbox, 1, wx.EXPAND, 5 ) - - settingsbox.Add( requiredbox, 1, wx.EXPAND, 5 ) - - optionalbox = wx.FlexGridSizer( 5, 1, 0, 0 ) - optionalbox.SetFlexibleDirection( wx.BOTH ) - optionalbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.title1 = wx.StaticText( self, wx.ID_ANY, u"Optional parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.title1.Wrap( -1 ) - self.title1.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) - - optionalbox.Add( self.title1, 0, wx.ALL, 5 ) - - typefacebox = wx.FlexGridSizer( 2, 1, 0, 0 ) - typefacebox.SetFlexibleDirection( wx.BOTH ) - typefacebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.typefacetext = wx.StaticText( self, wx.ID_ANY, u"Type of face:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.typefacetext .Wrap( -1 ) - typefacebox.Add( self.typefacetext , 0, wx.ALL, 5 ) - - typefacelistChoices = [ u"frontal_face", u"profile_face" ] - self.typefacelist = wx.ComboBox( self, wx.ID_ANY, u"frontal_face", wx.DefaultPosition, wx.DefaultSize, typefacelistChoices, wx.CB_READONLY ) - typefacebox.Add( self.typefacelist, 0, wx.ALL, 5 ) - - optionalbox.Add( typefacebox, 1, wx.EXPAND, 5 ) - - videospeedbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - videospeedbox.SetFlexibleDirection( wx.BOTH ) - videospeedbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.videospeedtext = wx.StaticText( self, wx.ID_ANY, u"Video Speed:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.videospeedtext.Wrap( -1 ) - videospeedbox.Add( self.videospeedtext, 0, wx.ALL, 5 ) - - videospeedlistChoices = [ u"slow", u"medium", u"fast" ] - self.videospeedlist = wx.ComboBox( self, wx.ID_ANY, u"medium", wx.DefaultPosition, wx.DefaultSize, videospeedlistChoices, wx.CB_READONLY ) - videospeedbox.Add( self.videospeedlist, 0, wx.ALL, 5 ) - - optionalbox.Add( videospeedbox, 1, wx.EXPAND, 5 ) - - videomodebox = wx.FlexGridSizer( 2, 1, 0, 0 ) - videomodebox.SetFlexibleDirection( wx.BOTH ) - videomodebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.videomodetext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered mode:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.videomodetext.Wrap( -1 ) - videomodebox.Add( self.videomodetext, 0, wx.ALL, 5 ) - - videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) - videomodechoices.SetFlexibleDirection( wx.BOTH ) - videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.cropmode = wx.RadioButton( self, wx.ID_ANY, u"Crop Mode", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) - self.cropmode.SetValue( True ) - videomodechoices.Add( self.cropmode, 0, wx.ALL, 5 ) - - self.conservativemode = wx.RadioButton( self, wx.ID_ANY, u"Conservative Mode", wx.DefaultPosition, wx.DefaultSize, 0 ) - videomodechoices.Add( self.conservativemode , 0, wx.ALL, 5 ) - - videomodebox.Add( videomodechoices, 1, wx.EXPAND, 5 ) - - optionalbox.Add( videomodebox, 1, wx.EXPAND, 5 ) - - filemethodbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - filemethodbox.SetFlexibleDirection( wx.BOTH ) - filemethodbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.filemethodtext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered method:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.filemethodtext.Wrap( -1 ) - filemethodbox.Add( self.filemethodtext, 0, wx.ALL, 5 ) - - videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) - videomodechoices.SetFlexibleDirection( wx.BOTH ) - videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.namemode = wx.RadioButton( self, wx.ID_ANY, u"File name", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) - self.namemode.SetValue( True ) - videomodechoices.Add( self.namemode, 0, wx.ALL, 5 ) - - self.exifmode = wx.RadioButton( self, wx.ID_ANY, u"EXIF metadata", wx.DefaultPosition, wx.DefaultSize, 0 ) - videomodechoices.Add( self.exifmode , 0, wx.ALL, 5 ) - - filemethodbox.Add( videomodechoices, 1, wx.EXPAND, 5 ) - - optionalbox.Add( filemethodbox, 1, wx.EXPAND, 5 ) - - settingsbox.Add( optionalbox, 1, wx.EXPAND, 5 ) - - maingrid.Add( settingsbox, 1, wx.EXPAND, 5 ) - - commandbox = wx.FlexGridSizer( 2, 1, 0, 0 ) - commandbox.SetFlexibleDirection( wx.BOTH ) - commandbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - buttonsbox = wx.FlexGridSizer( 1, 2, 0, 0 ) - buttonsbox.SetFlexibleDirection( wx.BOTH ) - buttonsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.startbutton = wx.Button( self, wx.ID_ANY, u"Create Movie!", wx.DefaultPosition, wx.DefaultSize, 0 ) - buttonsbox.Add( self.startbutton, 0, wx.ALL, 5 ) - - self.stopbutton = wx.Button( self, wx.ID_ANY, u"Stop processing", wx.DefaultPosition, wx.DefaultSize, 0 ) - buttonsbox.Add( self.stopbutton, 0, wx.ALL, 5 ) - - commandbox.Add( buttonsbox, 1, wx.EXPAND, 5 ) - - self.progressgauge = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) - commandbox.Add( self.progressgauge , 0, wx.ALL|wx.EXPAND, 5 ) - - maingrid.Add( commandbox, 1, wx.EXPAND, 5 ) - - self.SetSizer( maingrid ) - self.Layout() - self.sb = self.CreateStatusBar( 2, wx.ST_SIZEGRIP, wx.ID_ANY ) - self.menubar = wx.MenuBar( 0 ) - self.filemenu = wx.Menu() - self.menuhelp = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Help"+ u"\t" + u"CTRL + h", wx.EmptyString, wx.ITEM_NORMAL ) - self.filemenu.AppendItem( self.menuhelp ) - - self.menuabout = wx.MenuItem( self.filemenu, wx.ID_ANY, u"About"+ u"\t" + u"CTRL + F12", wx.EmptyString, wx.ITEM_NORMAL ) - self.filemenu.AppendItem( self.menuabout ) - - self.menuexit = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Exit"+ u"\t" + u"CTRL + Q", wx.EmptyString, wx.ITEM_NORMAL ) - self.filemenu.AppendItem( self.menuexit ) - - self.menubar.Append( self.filemenu, u"File" ) - - self.SetMenuBar( self.menubar ) - - - self.Centre( wx.BOTH ) - - # Connect Events - self.inputchooserbutton.Bind( wx.EVT_BUTTON, self.on_input ) - self.outputchooserbutton.Bind( wx.EVT_BUTTON, self.on_output ) - self.startbutton.Bind( wx.EVT_BUTTON, self.on_start ) - self.stopbutton.Bind( wx.EVT_BUTTON, self.on_stop ) - self.Bind( wx.EVT_MENU, self.on_help, id = self.menuhelp.GetId() ) - self.Bind( wx.EVT_MENU, self.on_about, id = self.menuabout.GetId() ) - self.Bind( wx.EVT_MENU, self.on_exit, id = self.menuexit.GetId() ) - - def __del__( self ): - pass - - - # Virtual event handlers, overide them in your derived class - def on_input( self, event ): - event.Skip() - - def on_output( self, event ): - event.Skip() - - def on_start( self, event ): - event.Skip() - - def on_stop( self, event ): - event.Skip() - - def on_help( self, event ): - event.Skip() - - def on_about( self, event ): - event.Skip() - - def on_exit( self, event ): - event.Skip() - + + def __init__( self, parent ): + wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 560,645 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) + + self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) + + self.statusbar = self.CreateStatusBar( 2, wx.ST_SIZEGRIP, wx.ID_ANY ) + self.menubar = wx.MenuBar( 0 ) + self.filemenu = wx.Menu() + self.exititem = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Exit"+ u"\t" + u"CTRL + q", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.exititem ) + + self.menubar.Append( self.filemenu, u"File" ) + + self.aboutmenu = wx.Menu() + self.helpitem = wx.MenuItem( self.aboutmenu, wx.ID_ANY, u"Help"+ u"\t" + u"CTRL + h", wx.EmptyString, wx.ITEM_NORMAL ) + self.aboutmenu.AppendItem( self.helpitem ) + + self.aboutmenu.AppendSeparator() + + self.aboutitem = wx.MenuItem( self.aboutmenu, wx.ID_ANY, u"About"+ u"\t" + u"CTRL + F12", wx.EmptyString, wx.ITEM_NORMAL ) + self.aboutmenu.AppendItem( self.aboutitem ) + + self.menubar.Append( self.aboutmenu, u"About" ) + + self.SetMenuBar( self.menubar ) + + mainsizer = wx.FlexGridSizer( 4, 1, 0, 0 ) + mainsizer.AddGrowableCol( 0 ) + mainsizer.AddGrowableRow( 2 ) + mainsizer.SetFlexibleDirection( wx.BOTH ) + mainsizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_ALL ) + + self.toolbar = wx.aui.AuiToolBar( self, wx.ID_ANY, wx.DefaultPosition, wx.Size( -1,25 ), wx.aui.AUI_TB_HORZ_LAYOUT ) + self.toolbar.SetToolBitmapSize( wx.Size( 25,25 ) ) + self.toolbar.SetMinSize( wx.Size( -1,25 ) ) + self.toolbar.SetMaxSize( wx.Size( -1,25 ) ) + + self.toolbar.AddTool( inputid, u"Input", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/folder_add_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddTool( settingsid, u"Settings", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/spanner_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddSeparator() + + self.toolbar.AddTool( startid, u"Go!", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/accepted_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddTool( stopid, u"Stop!", wx.Bitmap( u"../Ivolution/ivolution/data/media/icons/cancel_48.png", wx.BITMAP_TYPE_ANY ), wx.NullBitmap, wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None ) + + + self.toolbar.AddSeparator() + + self.helptool = wx.HyperlinkCtrl( self.toolbar, helpid, u"Ivolution online", u"http://jlengrand.github.com/FaceMovie/", wx.DefaultPosition, wx.DefaultSize, wx.HL_ALIGN_RIGHT ) + self.toolbar.AddControl( self.helptool ) + self.toolbar.Realize() + + mainsizer.Add( self.toolbar, 0, wx.EXPAND|wx.TOP, 0 ) + + self.inputtextbox = wx.StaticText( self, wx.ID_ANY, u"Chosen Folder : ", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.inputtextbox.Wrap( -1 ) + mainsizer.Add( self.inputtextbox, 0, wx.ALL, 5 ) + + self.filelist = wx.ListCtrl( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_LIST ) + mainsizer.Add( self.filelist, 0, wx.EXPAND, 5 ) + + self.progressgauge = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) + mainsizer.Add( self.progressgauge, 0, wx.ALL|wx.EXPAND, 5 ) + + self.SetSizer( mainsizer ) + self.Layout() + + self.Centre( wx.BOTH ) + + # Connect Events + self.Bind( wx.EVT_MENU, self.on_exit, id = self.exititem.GetId() ) + self.Bind( wx.EVT_MENU, self.on_help, id = self.helpitem.GetId() ) + self.Bind( wx.EVT_MENU, self.on_about, id = self.aboutitem.GetId() ) + self.Bind( wx.EVT_TOOL, self.on_input, id = inputid ) + self.Bind( wx.EVT_TOOL, self.on_settings, id = settingsid ) + self.Bind( wx.EVT_TOOL, self.on_start, id = startid ) + self.Bind( wx.EVT_TOOL, self.on_stop, id = stopid ) + self.helptool.Bind( wx.EVT_HYPERLINK, self.on_help ) + + def __del__( self ): + pass + + + # Virtual event handlers, overide them in your derived class + def on_exit( self, event ): + event.Skip() + + def on_help( self, event ): + event.Skip() + + def on_about( self, event ): + event.Skip() + + def on_input( self, event ): + event.Skip() + + def on_settings( self, event ): + event.Skip() + + def on_start( self, event ): + event.Skip() + + def on_stop( self, event ): + event.Skip() + + diff --git a/ivolution/gui_wx/IvolutionTemplate.v1 b/ivolution/gui_wx/IvolutionTemplate.v1 new file mode 100644 index 0000000..0fdb7ae --- /dev/null +++ b/ivolution/gui_wx/IvolutionTemplate.v1 @@ -0,0 +1,274 @@ +# -*- coding: utf-8 -*- + +########################################################################### +## Python code generated with wxFormBuilder (version Jun 30 2011) +## http://www.wxformbuilder.org/ +## +## PLEASE DO "NOT" EDIT THIS FILE! +########################################################################### + +import wx +import wx.xrc + +########################################################################### +## Class IvolutionTemplate +########################################################################### + +class IvolutionTemplate ( wx.Frame ): + + def __init__( self, parent ): + wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Ivolution", pos = wx.DefaultPosition, size = wx.Size( 250,620 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) + + self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) + + maingrid = wx.FlexGridSizer( 3, 1, 0, 0 ) + maingrid.SetFlexibleDirection( wx.BOTH ) + maingrid.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + titlelayout = wx.BoxSizer( wx.HORIZONTAL ) + + titlelayout.SetMinSize( wx.Size( 50,50 ) ) + logobox = wx.BoxSizer( wx.VERTICAL ) + + logobox.SetMinSize( wx.Size( 50,50 ) ) + self.logo = wx.StaticBitmap( self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 50,50 ), 0 ) + logobox.Add( self.logo, 1, wx.ALL, 5 ) + + titlelayout.Add( logobox, 1, wx.FIXED_MINSIZE, 5 ) + + self.title = wx.StaticText( self, wx.ID_ANY, u"Ivolution", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE|wx.ALIGN_LEFT ) + self.title.Wrap( -1 ) + self.title.SetFont( wx.Font( 16, 71, 90, 92, False, wx.EmptyString ) ) + + titlelayout.Add( self.title, 3, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 5 ) + + maingrid.Add( titlelayout, 1, wx.EXPAND, 5 ) + + settingsbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + settingsbox.SetFlexibleDirection( wx.BOTH ) + settingsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + requiredbox = wx.FlexGridSizer( 3, 1, 0, 0 ) + requiredbox.SetFlexibleDirection( wx.BOTH ) + requiredbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.title = wx.StaticText( self, wx.ID_ANY, u"Required parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.title.Wrap( -1 ) + self.title.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) + + requiredbox.Add( self.title, 0, wx.ALL, 5 ) + + inputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + inputbox.SetFlexibleDirection( wx.BOTH ) + inputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.inputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your input folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.inputtitle.Wrap( -1 ) + inputbox.Add( self.inputtitle, 0, wx.ALL, 5 ) + + inputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) + inputchooserbox.SetFlexibleDirection( wx.BOTH ) + inputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.inputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) + inputchooserbox.Add( self.inputchooserbutton, 1, wx.ALL, 5 ) + + self.inputtextbox = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Documents/Ivolutionnnn", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.inputtextbox.Wrap( -1 ) + inputchooserbox.Add( self.inputtextbox, 0, wx.ALL, 5 ) + + inputbox.Add( inputchooserbox, 1, wx.EXPAND, 5 ) + + requiredbox.Add( inputbox, 1, wx.EXPAND, 5 ) + + outputbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + outputbox.SetFlexibleDirection( wx.BOTH ) + outputbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.outputtitle = wx.StaticText( self, wx.ID_ANY, u"Choose your output folder:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.outputtitle.Wrap( -1 ) + outputbox.Add( self.outputtitle, 0, wx.ALL, 5 ) + + outputchooserbox = wx.FlexGridSizer( 1, 2, 0, 0 ) + outputchooserbox.SetFlexibleDirection( wx.BOTH ) + outputchooserbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.outputchooserbutton = wx.Button( self, wx.ID_ANY, u"..", wx.DefaultPosition, wx.Size( 30,25 ), 0 ) + outputchooserbox.Add( self.outputchooserbutton, 0, wx.ALL, 5 ) + + self.outputchoosertext = wx.StaticText( self, wx.ID_ANY, u"/home/jll/Videos", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.outputchoosertext.Wrap( -1 ) + outputchooserbox.Add( self.outputchoosertext, 0, wx.ALL, 5 ) + + outputbox.Add( outputchooserbox, 1, wx.EXPAND, 5 ) + + requiredbox.Add( outputbox, 1, wx.EXPAND, 5 ) + + settingsbox.Add( requiredbox, 1, wx.EXPAND, 5 ) + + optionalbox = wx.FlexGridSizer( 5, 1, 0, 0 ) + optionalbox.SetFlexibleDirection( wx.BOTH ) + optionalbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.title1 = wx.StaticText( self, wx.ID_ANY, u"Optional parameters:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.title1.Wrap( -1 ) + self.title1.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) + + optionalbox.Add( self.title1, 0, wx.ALL, 5 ) + + typefacebox = wx.FlexGridSizer( 2, 1, 0, 0 ) + typefacebox.SetFlexibleDirection( wx.BOTH ) + typefacebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.typefacetext = wx.StaticText( self, wx.ID_ANY, u"Type of face:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.typefacetext .Wrap( -1 ) + typefacebox.Add( self.typefacetext , 0, wx.ALL, 5 ) + + typefacelistChoices = [ u"frontal_face", u"profile_face" ] + self.typefacelist = wx.ComboBox( self, wx.ID_ANY, u"frontal_face", wx.DefaultPosition, wx.DefaultSize, typefacelistChoices, wx.CB_READONLY ) + typefacebox.Add( self.typefacelist, 0, wx.ALL, 5 ) + + optionalbox.Add( typefacebox, 1, wx.EXPAND, 5 ) + + videospeedbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + videospeedbox.SetFlexibleDirection( wx.BOTH ) + videospeedbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.videospeedtext = wx.StaticText( self, wx.ID_ANY, u"Video Speed:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.videospeedtext.Wrap( -1 ) + videospeedbox.Add( self.videospeedtext, 0, wx.ALL, 5 ) + + videospeedlistChoices = [ u"slow", u"medium", u"fast" ] + self.videospeedlist = wx.ComboBox( self, wx.ID_ANY, u"medium", wx.DefaultPosition, wx.DefaultSize, videospeedlistChoices, wx.CB_READONLY ) + videospeedbox.Add( self.videospeedlist, 0, wx.ALL, 5 ) + + optionalbox.Add( videospeedbox, 1, wx.EXPAND, 5 ) + + videomodebox = wx.FlexGridSizer( 2, 1, 0, 0 ) + videomodebox.SetFlexibleDirection( wx.BOTH ) + videomodebox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.videomodetext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered mode:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.videomodetext.Wrap( -1 ) + videomodebox.Add( self.videomodetext, 0, wx.ALL, 5 ) + + videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) + videomodechoices.SetFlexibleDirection( wx.BOTH ) + videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.cropmode = wx.RadioButton( self, wx.ID_ANY, u"Crop Mode", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) + self.cropmode.SetValue( True ) + videomodechoices.Add( self.cropmode, 0, wx.ALL, 5 ) + + self.conservativemode = wx.RadioButton( self, wx.ID_ANY, u"Conservative Mode", wx.DefaultPosition, wx.DefaultSize, 0 ) + videomodechoices.Add( self.conservativemode , 0, wx.ALL, 5 ) + + videomodebox.Add( videomodechoices, 1, wx.EXPAND, 5 ) + + optionalbox.Add( videomodebox, 1, wx.EXPAND, 5 ) + + filemethodbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + filemethodbox.SetFlexibleDirection( wx.BOTH ) + filemethodbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.filemethodtext = wx.StaticText( self, wx.ID_ANY, u"Choose your prefered method:", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.filemethodtext.Wrap( -1 ) + filemethodbox.Add( self.filemethodtext, 0, wx.ALL, 5 ) + + videomodechoices = wx.FlexGridSizer( 1, 2, 0, 0 ) + videomodechoices.SetFlexibleDirection( wx.BOTH ) + videomodechoices.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.namemode = wx.RadioButton( self, wx.ID_ANY, u"File name", wx.DefaultPosition, wx.DefaultSize, wx.RB_GROUP ) + self.namemode.SetValue( True ) + videomodechoices.Add( self.namemode, 0, wx.ALL, 5 ) + + self.exifmode = wx.RadioButton( self, wx.ID_ANY, u"EXIF metadata", wx.DefaultPosition, wx.DefaultSize, 0 ) + videomodechoices.Add( self.exifmode , 0, wx.ALL, 5 ) + + filemethodbox.Add( videomodechoices, 1, wx.EXPAND, 5 ) + + optionalbox.Add( filemethodbox, 1, wx.EXPAND, 5 ) + + settingsbox.Add( optionalbox, 1, wx.EXPAND, 5 ) + + maingrid.Add( settingsbox, 1, wx.EXPAND, 5 ) + + commandbox = wx.FlexGridSizer( 2, 1, 0, 0 ) + commandbox.SetFlexibleDirection( wx.BOTH ) + commandbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + buttonsbox = wx.FlexGridSizer( 1, 2, 0, 0 ) + buttonsbox.SetFlexibleDirection( wx.BOTH ) + buttonsbox.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.startbutton = wx.Button( self, wx.ID_ANY, u"Create Movie!", wx.DefaultPosition, wx.DefaultSize, 0 ) + buttonsbox.Add( self.startbutton, 0, wx.ALL, 5 ) + + self.stopbutton = wx.Button( self, wx.ID_ANY, u"Stop processing", wx.DefaultPosition, wx.DefaultSize, 0 ) + buttonsbox.Add( self.stopbutton, 0, wx.ALL, 5 ) + + commandbox.Add( buttonsbox, 1, wx.EXPAND, 5 ) + + self.progressgauge = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) + commandbox.Add( self.progressgauge , 0, wx.ALL|wx.EXPAND, 5 ) + + maingrid.Add( commandbox, 1, wx.EXPAND, 5 ) + + self.SetSizer( maingrid ) + self.Layout() + self.sb = self.CreateStatusBar( 2, wx.ST_SIZEGRIP, wx.ID_ANY ) + self.menubar = wx.MenuBar( 0 ) + self.filemenu = wx.Menu() + self.menuhelp = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Help"+ u"\t" + u"CTRL + h", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.menuhelp ) + + self.menuabout = wx.MenuItem( self.filemenu, wx.ID_ANY, u"About"+ u"\t" + u"CTRL + F12", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.menuabout ) + + self.menuexit = wx.MenuItem( self.filemenu, wx.ID_ANY, u"Exit"+ u"\t" + u"CTRL + Q", wx.EmptyString, wx.ITEM_NORMAL ) + self.filemenu.AppendItem( self.menuexit ) + + self.menubar.Append( self.filemenu, u"File" ) + + self.SetMenuBar( self.menubar ) + + + self.Centre( wx.BOTH ) + + # Connect Events + self.inputchooserbutton.Bind( wx.EVT_BUTTON, self.on_input ) + self.outputchooserbutton.Bind( wx.EVT_BUTTON, self.on_output ) + self.startbutton.Bind( wx.EVT_BUTTON, self.on_start ) + self.stopbutton.Bind( wx.EVT_BUTTON, self.on_stop ) + self.Bind( wx.EVT_MENU, self.on_help, id = self.menuhelp.GetId() ) + self.Bind( wx.EVT_MENU, self.on_about, id = self.menuabout.GetId() ) + self.Bind( wx.EVT_MENU, self.on_exit, id = self.menuexit.GetId() ) + + def __del__( self ): + pass + + + # Virtual event handlers, overide them in your derived class + def on_input( self, event ): + event.Skip() + + def on_output( self, event ): + event.Skip() + + def on_start( self, event ): + event.Skip() + + def on_stop( self, event ): + event.Skip() + + def on_help( self, event ): + event.Skip() + + def on_about( self, event ): + event.Skip() + + def on_exit( self, event ): + event.Skip() + + diff --git a/ivolution/gui_wx/IvolutionWindow.py b/ivolution/gui_wx/IvolutionWindow.py index 9fc84fe..79f493d 100644 --- a/ivolution/gui_wx/IvolutionWindow.py +++ b/ivolution/gui_wx/IvolutionWindow.py @@ -47,7 +47,6 @@ class IvolutionWindow(IvolutionTemplate, Observer, Observable): self.console_logger = None self.setup_logger() - self.logo = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"ivolution/data/media/vitruve_50.jpg", wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.Size(50, 50), 0) # Sets logo # Sets icon self.SetIcon(wx.Icon('ivolution/data/media/vitruve.ico', wx.BITMAP_TYPE_ICO)) # image = wx.Image("ivolution/data/media/vitruve.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap() @@ -72,6 +71,9 @@ class IvolutionWindow(IvolutionTemplate, Observer, Observable): self.Show(True) # Finally show the frame # Overriding event handling methods + def on_settings(self, event): + print "settings" + def on_start(self, event): """ User asks for starting the algorithm diff --git a/ivolution/gui_wx/IvolutionWindow.v1 b/ivolution/gui_wx/IvolutionWindow.v1 new file mode 100644 index 0000000..9fc84fe --- /dev/null +++ b/ivolution/gui_wx/IvolutionWindow.v1 @@ -0,0 +1,288 @@ +#!/usr/bin/env python +""" +.. module:: IvolutionWindow + :platform: Unix, Windows, Mac + :synopsis: Main Window of the Ivolution GUI designed to be supported by all platforms. + +.. moduleauthor:: Julien Lengrand-Lambert + +""" + +import wx +import wx.lib.newevent + +import os +import logging +import webbrowser + +from .. import get_data # used to load images and files + +from .. import FaceParams +from .. import FacemovieThread + +from ..util.Notifier import Observer +from ..util.Notifier import Observable + +from AboutDialog import AboutDialog +from IvolutionTemplate import IvolutionTemplate + + +class IvolutionWindow(IvolutionTemplate, Observer, Observable): + """ + Main Window of the Ivolution application + """ + def __init__(self, parent, title): + """ + Overrides init frame IvolutionTemplate + """ + IvolutionTemplate.__init__(self, parent) + Observer.__init__(self, title) + Observable.__init__(self) + + self.videospeedlistChoices = [u"slow", u"medium", u"fast"] # FIXME: Is there a way to do better? + self.gaugerange = 100 + + # Sets up logging capability + self.my_logger = None + self.console_logger = None + self.setup_logger() + + self.logo = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"ivolution/data/media/vitruve_50.jpg", wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.Size(50, 50), 0) # Sets logo + # Sets icon + self.SetIcon(wx.Icon('ivolution/data/media/vitruve.ico', wx.BITMAP_TYPE_ICO)) + # image = wx.Image("ivolution/data/media/vitruve.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap() + # icon = wx.EmptyIcon() + # icon.CopyFromBitmap(image) + # self.SetIcon(icon) + + # Defines all our parameters neededfor the facemovie + self.root_fo = "" + self.in_fo = "" # Input folder, where images are located + self.out_fo = "" # Input folder, where the video will be saved + self.mode = "crop" # type of video to be created + self.sort = "name" # how image files will be chronologically sorted + self.speed = 1 # Speed of the movie + self.param = "frontal_face" # type of face profile to be searched for + + self.in_fo = "" # Input folder, where images are located + + self.process_running = False + self.facemovie = None + + self.Show(True) # Finally show the frame + + # Overriding event handling methods + def on_start(self, event): + """ + User asks for starting the algorithm + Sets all parameters and start processing + """ + self.my_logger.debug("start pressed") + if not self.process_running: # start only if not already running + self.set_parameters() + self.print_parameters() + # Instantiating the facemovie + self.facemovie = FacemovieThread.FacemovieThread(self.face_params) + self.facemovie.subscribe(self) # I want new information ! Subscribes to facemovie reports + self.subscribe(self.facemovie) # Subscribing facemovie to our messages + + self.facemovie.start() + + self.process_running = True + else: + self.console_logger.error("Cannot start, process already running !") + self.my_logger.error("Cannot start, process already running !") + + def on_stop(self, event): + """ + User asks for stopping the algorithm + Asks the FacemovieThread to terminate + """ + self.my_logger.debug("Stop pressed") + self.console_logger.debug("Stop pressed") + self.notify(["STOP"]) # Asking the Facemovie to stop + self.process_running = False + + #self.on_exit(event) # Finally shuts down the interface + + def on_input(self, event): + """ + Activated when a user clicks to choose its input location + """ + default_dir = "~/Pictures" + self.inputdialog = wx.DirDialog(self, "Please choose your input directory", style=1, defaultPath=default_dir) + + if self.inputdialog.ShowModal() == wx.ID_OK: + self.inputtextbox.SetLabel(self.inputdialog.GetPath()) + self.inputdialog.Destroy() + + def on_output(self, event): + """ + Activated when a user clicks to choose its output location + """ + default_dir = "~/Videos" + self.outputdialog = wx.DirDialog(self, "Please choose your output directory", style=1, defaultPath=default_dir) + + if self.outputdialog.ShowModal() == wx.ID_OK: + self.outputchoosertext.SetLabel(self.outputdialog.GetPath()) + self.outputdialog.Destroy() + + def on_help(self, event): + """ + Opens a browser and points to online help. + """ + url = "http://jlengrand.github.com/FaceMovie/" + webbrowser.open(url, new=2) # in new tab if possible + + def on_about(self, event): + """ + Displays the about box for Ivolution + """ + about = AboutDialog(self, "Ivolution") + about.ShowModal() # Show it + about.Destroy() # finally destroy it when finished. + + def on_exit(self, event): + """ + Called when the IvolutionWindow is closed, or File/Exit is called. + """ + # Clean up code for saving application state should be added here. + self.notify(["STOP"]) # Asking the Facemovie to stop + self.process_running = False + self.Close(True) # Close the frame. + + # system methods + def get_current_mode(self): + """ + """ + if self.cropmode.GetValue(): + mode = "crop" + else: + mode = "conservative" + + return mode + + def get_current_sort(self): + """ + """ + if self.namemode.GetValue(): + sort = "name" + else: + sort = "exif" + + return sort + + def set_parameters(self): + """ + Retrieves all parameters needed for the algorithm to run + """ + self.in_fo = self.inputtextbox.GetLabel() + "/" + self.out_fo = self.outputchoosertext.GetLabel() + "/" + self.param = self.typefacelist.GetValue() + self.speed = self.videospeedlistChoices.index(self.videospeedlist.GetValue()) # We need and integer between 0 and 2 + + self.mode = self.get_current_mode() + self.sort = self.get_current_sort() + + # Instantiating the face_params object that will be needed by the facemovie + par_fo = os.path.join(self.root_fo, get_data("haarcascades")) + self.face_params = FaceParams.FaceParams(par_fo, + self.in_fo, + self.out_fo, + self.param, + self.sort, + self.mode, + self.speed) + + self.print_parameters() + + def print_parameters(self): + print "#########" + print "Settings:" + print "input folder : %s" % (self.in_fo) + print "output folder : %s" % (self.out_fo) + + print "Face Type : %s" % (self.param) + print "Speed chosen : %s" % (self.speed) + print "Mode chosen : %s" % (self.mode) + print "Sort method : %s" % (self.sort) + + print "#########" + + def setup_logger(self): + """ + Configures our logger to save error messages + Start logging in file here + """ + personal_dir = "~/.ivolution" + log_root = 'fm.log' + log_file = os.path.join(os.path.expanduser(personal_dir), log_root) + + # create logger for 'facemovie' + self.my_logger = logging.getLogger('FileLog') + + self.my_logger.setLevel(logging.DEBUG) + # create file handler which logs even debug messages + + #fh = logging.StreamHandler() + fh = logging.FileHandler(log_file) + + fh.setLevel(logging.DEBUG) + # create console handler with a higher log level + self.console_logger = logging.getLogger('ConsoleLog') + self.console_logger.setLevel(logging.DEBUG) # not needed + + ch = logging.StreamHandler() + #ch.setLevel(logging.DEBUG) # not needed + + # add the handlers to the logger + self.my_logger.addHandler(fh) + + self.my_logger.info("######") # Separating different sessions + + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + # create formatter and add it to the handlers + fh.setFormatter(formatter) + #ch.setFormatter(formatter) + + self.console_logger.addHandler(ch) + + def update(self, message): + """ + Trigerred by FacemovieThread. + Uses the Observer pattern to inform the user about the progress of the current job. + """ + if len(message) == 3: + # notifications + #self.console_logger.debug(message) + self.my_logger.debug(message) + + if message[0] == "PROGRESS": # progress bar + # big steps performed + wx.MutexGuiEnter() # to avoid thread problems + self.progressgauge.SetValue(self.gaugerange * float(message[2])) + self.sb.SetStatusText(message[1], 0) + wx.MutexGuiLeave() + + if float(message[2]) >= 1.0: # 100% of process + self.my_logger.debug("Reached end of facemovie process") + #self.console_logger.debug("Reached end of facemovie process") + self.process_running = False + + elif message[0] == "STATUS": # status label + if message[1] == "Error": + wx.MutexGuiEnter() # to avoid thread problems + self.sb.SetStatusText("Error detected", 0) + self.progressgauge.SetValue(0) + wx.MutexGuiLeave() + self.process_running = False + + wx.MutexGuiEnter() # to avoid thread problems + self.sb.SetStatusText(message[1], 1) + wx.MutexGuiLeave() + + elif len(message) > 1: # system commands shall be ignored + self.console_logger.debug("Unrecognized command") + self.my_logger.debug("Unrecognized command") + self.console_logger.debug(message) + self.my_logger.debug(message) \ No newline at end of file