Reputation: 1173
I am learning python and trying out wxpython for UI development (dont have UI exp either). I have been able to create a frame with a panel, a button and a text input box. I would like to be able to enter text into the textbox and have the program do things to the text entered into the box after I click the button. Can I get some guidence as to how to do this? for example, lets say I want to display the text entered into the wx.TextCtrl control on the panel.. How would i do that?
import wx
class ExamplePanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.quote = wx.StaticText(self, label="Your quote :", pos=(20, 30))
# A button
self.button =wx.Button(self, label="Save", pos=(200, 325))
self.lblname = wx.StaticText(self, label="Your name :", pos=(20,60))
self.editname = wx.TextCtrl(self, value="Enter here your name", pos=(150, 60), size=(140,-1))
app = wx.App(False)
frame = wx.Frame(None)
panel = ExamplePanel(frame)
frame.Show()
app.MainLoop()
Upvotes: 12
Views: 43470
Reputation: 9451
To do any GUI interactions you have to bind events to the widgets. You basically tell the wxPython app which method (event handler) should be called when some event (button pressed) occurs.
I would also consider learning sizers and using them for your layouts. I have changed your example a bit.
import wx
class ExampleFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.panel = wx.Panel(self)
self.quote = wx.StaticText(self.panel, label="Your quote:")
self.result = wx.StaticText(self.panel, label="")
self.result.SetForegroundColour(wx.RED)
self.button = wx.Button(self.panel, label="Save")
self.lblname = wx.StaticText(self.panel, label="Your name:")
self.editname = wx.TextCtrl(self.panel, size=(140, -1))
# Set sizer for the frame, so we can change frame size to match widgets
self.windowSizer = wx.BoxSizer()
self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND)
# Set sizer for the panel content
self.sizer = wx.GridBagSizer(5, 5)
self.sizer.Add(self.quote, (0, 0))
self.sizer.Add(self.result, (0, 1))
self.sizer.Add(self.lblname, (1, 0))
self.sizer.Add(self.editname, (1, 1))
self.sizer.Add(self.button, (2, 0), (1, 2), flag=wx.EXPAND)
# Set simple sizer for a nice border
self.border = wx.BoxSizer()
self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)
# Use the sizers
self.panel.SetSizerAndFit(self.border)
self.SetSizerAndFit(self.windowSizer)
# Set event handlers
self.button.Bind(wx.EVT_BUTTON, self.OnButton)
def OnButton(self, e):
self.result.SetLabel(self.editname.GetValue())
app = wx.App(False)
frame = ExampleFrame(None)
frame.Show()
app.MainLoop()
Upvotes: 24