Tags: abutton, boxes, button, choice, click, controls, created, event, form, frame, linking, onclick, programming, python, radio, text, write

Linking onClick event to other controls on the Frame

On Programmer » Python

4,400 words with 2 Comments; publish: Wed, 07 May 2008 16:35:00 GMT; (20078.13, « »)

Hello,

I've created a simple form with 2 radio boxes, 2 text boxes and a

button.

When I click the button, I'd like to write each "choice" to a text

file.

I can't figure out how to "link" the onClick event to the other 4

controls.

Any help would be much appreciated!

R.D. Harles

import wx, sys

class Form1(wx.Panel):

def __init__(self, parent, id):

wx.Panel.__init__(self, parent, id)

# Create button

self.button =wx.Button(self, 50, "GO!", wx.Point(20, 200))

wx.EVT_BUTTON(self, 50, self.OnClick)

## First name

# Edit control

self.lblname = wx.StaticText(self, -1, "First Name

:",wx.Point(20,50))

self.editname = wx.TextCtrl(self, 10, "", wx.Point(90, 50),

wx.Size(100,-1))

wx.EVT_TEXT(self, 10, self.EvtText)

## Last Name

# Edit control

self.lblname = wx.StaticText(self, -1, "Last Name

:",wx.Point(20,75))

self.editname = wx.TextCtrl(self, 20, "", wx.Point(90, 75),

wx.Size(100,-1))

wx.EVT_TEXT(self, 20, self.EvtText)

# Radio Boxes

self.radioList = ['Employed', 'Unemployed']

rb = wx.RadioBox(self, 30, "Status:", wx.Point(20, 100),

wx.DefaultSize,

self.radioList, 2, wx.RA_SPECIFY_COLS)

wx.EVT_RADIOBOX(self, 30, self.EvtRadioBox)

# Radio Boxes

self.radioList = ['Married', 'Single']

rb = wx.RadioBox(self, 40, "Status:", wx.Point(20, 150),

wx.DefaultSize,

self.radioList, 2, wx.RA_SPECIFY_COLS)

wx.EVT_RADIOBOX(self, 40, self.EvtRadioBox)

# Text event

def EvtText(self, event):

print event.GetString()

# RadioBox event

def EvtRadioBox(self, event):

print event.GetId()

# Button event

def OnClick(self,event):

print "Writing job.cfg..."

file = open("job.cfg", "w")

file.write("")

app = wx.PySimpleApp()

frame = wx.Frame(None, -1, " Questions")

Form1(frame,-1)

frame.Show(1)

app.MainLoop()

All Comments

Leave a comment...

  • 2 Comments
    • Hello Harles,

      Please define "link" - is it bind event, get information from control,

      ...?

      If I'm guessing the you want to the the value of each control then you

      need to store a reference to this control and call the method that gets

      the value of each control.

      (GetValue() for most, GetStringSelection() for others ...)

      Also I suggest you use sizers instead of hard coding the widgets

      location.

      My best suggestion however is that you download the wxPython demo and

      view the examples over there.

      See revised code below:

      import wx

      class Form1(wx.Panel):

      def __init__(self, parent, id):

      wx.Panel.__init__(self, parent, id)

      sizer = wx.GridSizer(wx.VERTICAL)

      gsizer = wx.FlexGridSizer(2, 2)

      # First Name: _______

      gsizer.Add(wx.StaticText(self, -1, "First Name:"))

      self._first_name = wx.TextCtrl(self, -1, size=(100, -1))

      gsizer.Add(self._first_name, 0, wx.EXPAND)

      # Last Name: _______

      gsizer.Add(wx.StaticText(self, -1, "Last Name:"))

      self._last_name = wx.TextCtrl(self, -1, size=(100, -1))

      gsizer.Add(self._last_name, 0, wx.EXPAND)

      gsizer.AddGrowableCol(1)

      sizer.Add(gsizer, 1, wx.EXPAND)

      self._work_status = wx.RadioBox(self, -1, "Work Status",

      choices=["Employed", "Unemployed"])

      sizer.Add(self._work_status, 0, wx.EXPAND)

      self._martial_status = wx.RadioBox(self, -1, "Martial Status",

      choices=["Married", "Single"])

      sizer.Add(self._martial_status, 0, wx.EXPAND)

      b = wx.Button(self, -1, "GO!")

      self.Bind(wx.EVT_BUTTON, self.OnClick, b)

      sizer.Add(b)

      self.SetSizer(sizer)

      self.SetAutoLayout(1)

      sizer.Fit(self)

      # Button event

      def OnClick(self,event):

      fo = open("job.cfg", "w")

      print >> fo, "First Name:", self._first_name.GetValue()

      print >> fo, "Last Name:", self._last_name.GetValue()

      print >> fo, "Work Status:",

      self._work_status.GetStringSelection()

      print >> fo, "Martial Status:",

      self._martial_status.GetStringSelection()

      fo.close()

      HTH,

      Miki

      http://pythonwise.blogspot.com/

      #1; Wed, 07 May 2008 16:37:00 GMT
    • Hi Miki,

      I appreciate you taking the time to figure out what I was trying to do.

      This is exactly what I was looking for.

      I plan on studing this code and looking at the wxpython demo as you

      mentioned.

      Thanks again!

      R.D. Harles

      #2; Wed, 07 May 2008 16:38:00 GMT