On Apr 19, 1:38 pm, Tyler <[EMAIL PROTECTED]> wrote: > 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()
You can do this: --- class MyFrame(wx.Frame): .. .. .. def OnSubmit(self, event): globals()["userInput"] = self.txtCtrlName.GetValue() self.Close() app = MyApp() app.MainLoop() print userInput ----- -- http://mail.python.org/mailman/listinfo/python-list