wxPython and how to return text entry to main program?
7stud
bbxx789_05ss at yahoo.com
Thu Apr 19 20:51:30 EDT 2007
On Apr 19, 1:38 pm, Tyler <hayes.ty... at gmail.com> 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
-----
More information about the Python-list
mailing list