wxPython and how to return text entry to main program?
Tyler
hayes.tyler at gmail.com
Thu Apr 19 15:38:10 EDT 2007
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()
More information about the Python-list
mailing list