Hello All: I am currently working on a project to create an FEM model for school. I was thinking about using wxPython to gather the 12 input variables from the user, then, after pressing the "Run" button, the GUI would close, and the 12 input variables would then be available for the rest of the program.
So far, what I have been able to do is mostly a reverse engineering job to get the frame to look right and return the text variable to a dialog box. I have read about a "redirect" that could be used to send the values to a file. But, then I would have to open the file and read in the data from there. This seems crude and lacking elegance. Any help on how to get the program to output the data back to the main python program and close when I press submit? My apologies if this is something of a simple question, but I have only started in on wxPython about a week ago, and Python this term. The codes I am using are below. Any help (or suggested reading material) is greatly appreciated. Cheers, t. MY MAIN PROGRAM #!/usr/bin/env python import femGUI app = femGUI.MyApp(False) dlg = femGUI.FemInput() dlg.Destroy() app.MainLoop() # Then do something with inputs here.... THE FEMINPUT GUI CLASS import wx class FemInput(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "Options Input Interface") panel = wx.Panel(self) # First create the controls # Title topLbl = wx.StaticText(panel, -1, "FEM 2D Basket Put Option ",size=(420,-1)) topLbl.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) # S1 lower and upper bounds for grid s1label = wx.StaticText(panel, -1, "S1 Low , S2 Low: ", size=(220,-1)) self.s1lower = wx.TextCtrl(panel, -1, "", size=(100,-1)); self.s2lower = wx.TextCtrl(panel, -1, "", size=(100,-1)); # S2 lower and upper bounds for grid s2label = wx.StaticText(panel, -1, "S1 High, S2 High: ", size=(220,-1)) self.s1upper = wx.TextCtrl(panel, -1, "", size=(100,-1)); self.s2upper = wx.TextCtrl(panel, -1, "", size=(100,-1)); # S1 and S2 volatility vlabel = wx.StaticText(panel, -1, "S1 Volatility, S2 Volatility: ", size=(220,-1)) self.v1vol = wx.TextCtrl(panel, -1, "", size=(100,-1)); self.v2vol = wx.TextCtrl(panel, -1, "", size=(100,-1)); # Risk free rate and correlation prlabel = wx.StaticText(panel, -1, "Interest Rate, Correlation: ", size=(220,-1)) self.risk = wx.TextCtrl(panel, -1, "", size=(100,-1)); self.corr = wx.TextCtrl(panel, -1, "", size=(100,-1)); # Strike and Exercise Date kTlabel = wx.StaticText(panel, -1, "Srike Price, Exercise Date: ", size=(220,-1)) self.strike = wx.TextCtrl(panel, -1, "", size=(100,-1)); self.finalT = wx.TextCtrl(panel, -1, "", size=(100,-1)); # deltaT and deltaX dTXlabel = wx.StaticText(panel, -1, "delta T, delta X: ", size=(220,-1)) self.deltaT = wx.TextCtrl(panel, -1, "", size=(100,-1)); self.deltaX = wx.TextCtrl(panel, -1, "", size=(100,-1)); # Execute program runBtn = wx.Button(panel, -1, "Run") self.Bind(wx.EVT_BUTTON, self.OnSubmit, runBtn) # Now do the layout. # mainSizer is the top-level one that manages everything mainSizer = wx.BoxSizer(wx.VERTICAL) mainSizer.Add(topLbl, 0, wx.ALL, 5) mainSizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5) # femSizer is a grid that holds all of the address info femSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5) femSizer.AddGrowableCol(1) # S1 and S2 LOWER label femSizer.Add(s1label, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) # the lower and upper S1 bounds are in a sub-sizer s1Sizer = wx.BoxSizer(wx.HORIZONTAL) s1Sizer.Add(self.s1lower, 1) s1Sizer.Add((10,10)) # some empty space s1Sizer.Add(self.s2lower, 1, wx.LEFT|wx.RIGHT, 5) femSizer.Add(s1Sizer, 1, wx.EXPAND) # S1 and S2 HIGH label femSizer.Add(s2label, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) # the lower and upper S1 bounds are in a sub-sizer s2Sizer = wx.BoxSizer(wx.HORIZONTAL) s2Sizer.Add(self.s1upper, 1) s2Sizer.Add((10,10)) # some empty space s2Sizer.Add(self.s2upper, 1, wx.LEFT|wx.RIGHT, 5) femSizer.Add(s2Sizer, 1, wx.EXPAND) # Volatility label femSizer.Add(vlabel, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) # the lower and upper S1 bounds are in a sub-sizer volSizer = wx.BoxSizer(wx.HORIZONTAL) volSizer.Add(self.v1vol, 1) volSizer.Add((10,10)) # some empty space volSizer.Add(self.v2vol, 1, wx.LEFT|wx.RIGHT, 5) femSizer.Add(volSizer, 1, wx.EXPAND) # Risk free Rate and corelation femSizer.Add(prlabel, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) # the lower and upper S1 bounds are in a sub-sizer rcSizer = wx.BoxSizer(wx.HORIZONTAL) rcSizer.Add(self.risk, 1) rcSizer.Add((10,10)) # some empty space rcSizer.Add(self.corr, 1, wx.LEFT|wx.RIGHT, 5) femSizer.Add(rcSizer, 1, wx.EXPAND) # Strike and Exercise Date femSizer.Add(kTlabel, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) # the lower and upper S1 bounds are in a sub-sizer ktSizer = wx.BoxSizer(wx.HORIZONTAL) ktSizer.Add(self.strike, 1) ktSizer.Add((10,10)) # some empty space ktSizer.Add(self.finalT, 1, wx.LEFT|wx.RIGHT, 5) femSizer.Add(ktSizer, 1, wx.EXPAND) # deltaT and deltaX femSizer.Add(dTXlabel, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL) # the lower and upper S1 bounds are in a sub-sizer dtxSizer = wx.BoxSizer(wx.HORIZONTAL) dtxSizer.Add(self.deltaT, 1) dtxSizer.Add((10,10)) # some empty space dtxSizer.Add(self.deltaX, 1, wx.LEFT|wx.RIGHT, 5) femSizer.Add(dtxSizer, 1, wx.EXPAND) # now add the femSizer to the mainSizer mainSizer.Add(femSizer, 0, wx.EXPAND|wx.ALL, 10) # The buttons sizer will put them in a row with resizeable # gaps between and on either side of the buttons btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add((10,10)) # some empty space btnSizer.Add(runBtn) btnSizer.Add((10,10)) # some empty space mainSizer.Add(btnSizer, 0, wx.EXPAND|wx.BOTTOM, 10) panel.SetSizer(mainSizer) # Fit the frame to the needs of the sizer. The frame will # automatically resize the panel as needed. Also prevent the # frame from getting smaller than this size. mainSizer.Fit(self) mainSizer.SetSizeHints(self) def OnSubmit(self, evt): s1low = self.s1lower.GetValue() s2low = self.s2lower.GetValue() s1high = self.s1upper.GetValue() s2high = self.s2upper.GetValue() s1vol = self.v1vol.GetValue() s2vol = self.v2vol.GetValue() irate = self.risk.GetValue() pcorr = self.corr.GetValue() kprice = self.strike.GetValue() totalT = self.finalT.GetValue() delT = self.deltaT.GetValue() delX = self.deltaX.GetValue() wx.MessageBox('You chose: \n %s \n %s \n %s \n %s \ \n %s \n %s \n %s' % (s1low,s2low,s1high,s2high,s1vol,s2vol,irate)) # I want to do something like this below.... # return s1low,s2low,s1high,s2high,s1vol,s2vol,irate class MyApp(wx.App): def OnInit(self): frame = FemInput() self.SetTopWindow(frame) frame.Show() return True # Needed if called as a module if __name__ == '__main__': app = MyApp(False) app.MainLoop() -- http://mail.python.org/mailman/listinfo/python-list