+from wxPython.wx import *
+import os
+
+#----------------------------------------------------------------------
+
+class FileBrowseButton(wxPanel):
+ ''' A control to allow the user to type in a filename
+ or browse with the standard file dialog to select file
+
+ __init__ (
+ parent, id, pos, size -- passed directly to wxPanel initialisation
+ style = wxTAB_TRAVERSAL -- passed directly to wxPanel initialisation
+ labelText -- Text for label to left of text field
+ buttonText -- Text for button which launches the file dialog
+ toolTip -- Help text
+ dialogTitle -- Title used in file dialog
+ startDirectory -- Default directory for file dialog startup
+ fileMask -- File mask (glob pattern, such as *.*) to use in file dialog
+ fileMode -- wxOPEN or wxSAVE, indicates type of file dialog to use
+ changeCallback -- callback receives all changes in value of control
+ )
+ GetValue() -- retrieve current value of text control
+ SetValue(string) -- set current value of text control
+ label -- pointer to internal label widget
+ textControl -- pointer to internal text control
+ browseButton -- pointer to button
+ '''
+ def __init__ (self, parent, id= -1,
+ pos = wxDefaultPosition, size = wxDefaultSize,
+ style = wxTAB_TRAVERSAL,
+ labelText= "File Entry:",
+ buttonText= "Browse",
+ toolTip= "Type filename or browse computer to choose file",
+ # following are the values for a file dialog box
+ dialogTitle = "Choose a file",
+ startDirectory = ".",
+ initialValue = "",
+ fileMask = "*.*",
+ fileMode = wxOPEN,
+ # callback for when value changes (optional)
+ changeCallback= None
+ ):
+ wxPanel.__init__ (self, parent, id, pos, size, style)
+ # store variables
+ self.dialogTitle = dialogTitle
+ self.startDirectory = startDirectory
+ self.fileMask = fileMask
+ self.fileMode = fileMode
+ self.changeCallback = changeCallback
+
+ box = wxBoxSizer(wxHORIZONTAL)
+ self.label = wxStaticText(self, -1, labelText, style =wxALIGN_RIGHT )
+ font = self.label.GetFont()
+ w, h, d, e = self.GetFullTextExtent(labelText, font)
+ self.label.SetSize(wxSize(w+5, h))
+ box.Add( self.label, 0, wxCENTER )
+
+ ID = wxNewId()
+ self.textControl = wxTextCtrl(self, ID)
+ self.textControl.SetToolTipString( toolTip )
+ box.Add( self.textControl, 1, wxLEFT|wxCENTER, 5)
+ if changeCallback:
+ EVT_TEXT(self.textControl, ID, changeCallback)
+
+ ID = wxNewId()
+ self.browseButton = button =wxButton(self, ID, buttonText)
+ box.Add( button, 0, wxCENTER)
+ button.SetToolTipString( toolTip )
+ EVT_BUTTON(button, ID, self.OnBrowse)
+
+ # add a border around the whole thing and resize the panel to fit
+ outsidebox = wxBoxSizer(wxVERTICAL)
+ outsidebox.Add(box, 1, wxEXPAND|wxALL, 3)
+ outsidebox.Fit(self)
+
+ self.SetAutoLayout(true)
+ self.SetSizer( outsidebox )
+ self.Layout()
+ if size.width != -1 or size.height != -1:
+ self.SetSize(size)
+
+
+
+ def OnBrowse (self, event = None):
+ ''' Going to browse for file... '''
+ current = self.GetValue ()
+ directory = os.path.split(current)
+ if os.path.isdir( current):
+ directory =current
+ elif directory and os.path.isdir( directory[0] ):
+ directory = directory [0]
+ else:
+ directory = self.startDirectory
+ dlg = wxFileDialog(self, self.dialogTitle, directory, current, self.fileMask, self.fileMode)
+ if dlg.ShowModal() == wxID_OK:
+ self.SetValue (dlg.GetPath())
+ dlg.Destroy()
+ self.textControl.SetFocus()
+
+
+ def GetValue (self):
+ ''' Convenient access to text control value '''
+ return self.textControl.GetValue ()
+
+
+ def SetValue (self, value):
+ ''' Convenient setting of text control value '''
+ return self.textControl.SetValue (value)
+
+
+#----------------------------------------------------------------------
+
+
+if __name__ == "__main__":
+ #from skeletonbuilder import rulesfile
+ class DemoFrame( wxFrame ):
+ def __init__(self, parent):
+ wxFrame.__init__(self, parent, 2400, "File entry with browse", size=(500,100) )
+ panel = wxPanel (self,-1)
+ innerbox = wxBoxSizer(wxVERTICAL)
+ control = FileBrowseButton(panel)
+ innerbox.Add( control, 0, wxEXPAND )
+ control = FileBrowseButton(panel, labelText = "With Callback", style = wxSUNKEN_BORDER ,changeCallback= self.OnFileNameChanged)
+ innerbox.Add( control, 0, wxEXPAND|wxALIGN_BOTTOM )
+ panel.SetAutoLayout(true)
+ panel.SetSizer( innerbox )
+
+ def OnFileNameChanged (self, event):
+ print "Filename changed", event.GetString ()
+
+ def OnCloseMe(self, event):
+ self.Close(true)
+
+ def OnCloseWindow(self, event):
+ self.Destroy()
+
+ class DemoApp(wxApp):
+ def OnInit(self):
+ wxImage_AddHandler(wxJPEGHandler())
+ wxImage_AddHandler(wxPNGHandler())
+ wxImage_AddHandler(wxGIFHandler())
+ frame = DemoFrame(NULL)
+ #frame = RulesPanel(NULL )
+ frame.Show(true)
+ self.SetTopWindow(frame)
+ return true
+
+ def test( ):
+ app = DemoApp(0)
+ app.MainLoop()
+ print 'Creating dialogue'
+ test( )
+
+
+