Hi everyone.

Im having some real head-ache inducing issues with my code. I want to update a statictext label to display the value of a slider bar.

Simple enough?

Here is my code...

Speed_Slider_Panel = wx.Panel(Automatic_Control_Panel)
                
        Speed_Slider = wx.Slider(Speed_Slider_Panel, ID_SPEED_SLIDER, 0, 0, 10,
                                 style = wx.HORIZONTAL | wx.SL_AUTOTICKS)
        Speed_Slider.SetTickFreq(1, 1)
        
        self.Bind(wx.EVT_SLIDER, self.OnSpeedSlider, id=ID_SPEED_SLIDER)

the 'family tree' goes;

self
|
Main_Panel
|
Control_Panel
|
Automatic_Control_Panel
|
Speed_Slider_Panel / Speed_Judder_Panel

This is the label;

Speed_Judder_Panel = wx.Panel(Automatic_Control_Panel)
        Speed_Judder_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        Speed_Label = wx.StaticText(Speed_Judder_Panel, ID_SPEED_LABEL, "Speed = %d" % Speed)
        Speed_Label.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))

And try as i might i cannot get the label value to change with the slider. I keep getting told various things arent defined or that certain things dont have certain attribute...

def OnSpeedSlider(self, event):
        Speed_Label.SetLabel("Speed = %d" % event.GetValue())

That snippett is wrong for sure but i dont know what to do to it to get it to work :-s


Any help is greatly appreciated!


Mark

Hi - thanks for the reply. Sorry took a while to get back.

import wx
import os
ID_MENU_NEW_WIZ = 101
ID_MENU_SAVE    = 102
ID_MENU_LOAD    = 103
ID_MENU_EXIT    = 104
ID_MENU_HELP    = 105
ID_MENU_ABOUT   = 106
ID_RADIO_FORWARDS   = 201
ID_RADIO_STATIONARY = 202
ID_RADIO_BACKWARDS  = 203
ID_SPEED_LABEL      = 204
ID_SPEED_SLIDER     = 301
ID_SPEED_LABEL         = 401
ID_SPEED_JUDDER_BUTTON = 402
# 501-> Reserved for Bristle manual control checkboxes
# 601-> Reserved for Cylinder manual control checkboxes
ID_ACTION_BUTTON_GO   = 701
ID_ACTION_BUTTON_STOP = 702
Speed = 3
Cylinders = 2
Bristles  = 3
 
class Frame1(wx.Frame): 
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, pos=(150, 150))
        Icon = wx.Icon("icon3.ico", wx.BITMAP_TYPE_ICO)
        self.SetIcon(Icon)
        
### MENU ###
        
        # Create a menubar at the top of the frame
        MenuBar = wx.MenuBar()
        FileMenu = wx.Menu()
        HelpMenu = wx.Menu() 
        # Add items to the menu
        FileMenu.Append(ID_MENU_NEW_WIZ, "&New Tractor Wizard\tCtrl-N", "Start the New Tractor wizard")
        FileMenu.Append(ID_MENU_SAVE, "&Save\tCtrl-S", "Save the current tractor configuration to file")
        FileMenu.Append(ID_MENU_LOAD, "&Load\tCtrl-L", "Open a tractor configuration from file")
        FileMenu.AppendSeparator()
        FileMenu.Append(ID_MENU_EXIT, "E&xit\tAlt-F4", "Exit the program")
        
        HelpMenu.Append(ID_MENU_HELP, "&Help\tF1", "Open the Help file")
        HelpMenu.AppendSeparator()
        HelpMenu.Append(ID_MENU_ABOUT, "&About", "About the program")
 
        # Bind the menu event to an event handler
        self.Bind(wx.EVT_MENU, self.OnMenuSave, id = ID_MENU_SAVE)
        self.Bind(wx.EVT_MENU, self.OnMenuLoad, id = ID_MENU_LOAD)
        self.Bind(wx.EVT_MENU, self.OnMenuExit, id = ID_MENU_EXIT)
        self.Bind(wx.EVT_MENU, self.OnMenuAbout, id = ID_MENU_ABOUT)
 
        # Put the menu on the menubar
        MenuBar.Append(FileMenu, "&File")
        MenuBar.Append(HelpMenu, "&Help")
        self.SetMenuBar(MenuBar)
        

### STATUS BAR ###
        
        self.CreateStatusBar()
 
### MAIN PANEL ###
        
        Main_Panel = wx.Panel(self)
        Main_Panel.SetBackgroundColour((225,245,255))
 
### TITLE PANEL ###
        
        Title_Panel = wx.Panel(Main_Panel)
 
        Title_Label = wx.StaticText(Title_Panel, -1, "Sequence Driven Controller")
        Title_Label.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, True))
        Title_Label.SetForegroundColour('#00009F')
        Title_Image = wx.Image("DPT Image.jpg", wx.BITMAP_TYPE_ANY)
        Title_Bitmap_Widget = wx.StaticBitmap(Title_Panel, -1, wx.BitmapFromImage(Title_Image))
        Title_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        Title_Sizer.Add(Title_Bitmap_Widget, 1, wx.ALIGN_CENTER)
        Title_Sizer.Add(Title_Label, 4, wx.ALIGN_CENTER | wx.LEFT, 10)
        
        Title_Panel.SetSizer(Title_Sizer)
        Title_Panel.Layout()
 
### CONTROL PANEL setup ###
        Control_Panel = wx.Panel(Main_Panel)
        Control_Sizer = wx.BoxSizer(wx.HORIZONTAL)
 
### AUTOMATIC CONTROL setup ###
        Automatic_Control_Panel = wx.Panel(Control_Panel)
        Automatic_Box = wx.StaticBox(Automatic_Control_Panel, -1, 'Automated Control')
        Automatic_Box.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))
        Automatic_Control_Sizer = wx.StaticBoxSizer(Automatic_Box, wx.VERTICAL)
 
### DIRECTION PANEL ###
        Direction_Panel = wx.Panel(Automatic_Control_Panel)
        
        RadioButtonForwards = wx.RadioButton(Direction_Panel, ID_RADIO_FORWARDS, "Forwards")
        RadioButtonStationary = wx.RadioButton(Direction_Panel, ID_RADIO_STATIONARY, "Stationary")
        RadioButtonBackwards = wx.RadioButton(Direction_Panel, ID_RADIO_BACKWARDS, "Backwards")
        
        Direction_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        Direction_Sizer.Add(RadioButtonForwards, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        Direction_Sizer.Add(RadioButtonStationary, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        Direction_Sizer.Add(RadioButtonBackwards, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
               
        Direction_Panel.SetSizer(Direction_Sizer)
        Direction_Panel.Layout()
 
### SPEED SLIDER & JUDDER ###
        Speed_Slider_Panel = wx.Panel(Automatic_Control_Panel)
                
        Speed_Slider = wx.Slider(Speed_Slider_Panel, ID_SPEED_SLIDER, 0, 0, 10,
                                 style = wx.HORIZONTAL | wx.SL_AUTOTICKS)
        Speed_Slider.SetTickFreq(1, 1)
        
        self.Bind(wx.EVT_SLIDER, self.OnSpeedSlider, id=ID_SPEED_SLIDER)
        
        Speed_Slider_Sizer = wx.BoxSizer(wx.HORIZONTAL) 
        Speed_Slider_Sizer.Add(Speed_Slider, -1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        
        Speed_Slider_Panel.SetSizer(Speed_Slider_Sizer)
        Speed_Slider_Panel.Layout()
 
### SPEED & JUDDER ###
        Speed_Judder_Panel = wx.Panel(Automatic_Control_Panel)
        Speed_Judder_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        Speed_Label = wx.StaticText(Speed_Judder_Panel, ID_SPEED_LABEL, "Speed = %d" % Speed)
        Speed_Label.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))
        
        Speed_Judder_Button = wx.ToggleButton(Speed_Judder_Panel, ID_SPEED_JUDDER_BUTTON, "Judder")
        Speed_Judder_Sizer.Add(Speed_Label, 3, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        Speed_Judder_Sizer.Add(Speed_Judder_Button, 2, wx.EXPAND | wx.ALL, 2)
        Speed_Judder_Panel.SetSizer(Speed_Judder_Sizer)
        Speed_Judder_Panel.Layout()
 
### AUTOMATIC CONTROL layout ###
        Automatic_Control_Sizer.Add(Direction_Panel, 1, wx.EXPAND)
        Automatic_Control_Sizer.Add(Speed_Slider_Panel, 1, wx.EXPAND)
        Automatic_Control_Sizer.Add(Speed_Judder_Panel, 1, wx.EXPAND)
        Automatic_Control_Panel.SetSizer(Automatic_Control_Sizer)
        Automatic_Control_Sizer.Fit(self)                # Fit frame to neccessary size
        Automatic_Control_Sizer.SetSizeHints(self)       # Prevents frame from getting smaller than min.
        Automatic_Control_Panel.Layout()
 
### MANUAL CONTROL ###
        Manual_Control_Panel = wx.Panel(Control_Panel)
        Bristles_Panel = wx.Panel(Manual_Control_Panel)
        Cylinders_Panel = wx.Panel(Manual_Control_Panel)
        Manual_Box = wx.StaticBox(Manual_Control_Panel, -1, 'Manual Control')
        Manual_Box.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))
        Manual_Control_Sizer = wx.StaticBoxSizer(Manual_Box, wx.HORIZONTAL)
        Bristles_Sizer = wx.BoxSizer(wx.VERTICAL)
        Cylinders_Sizer = wx.BoxSizer(wx.VERTICAL)

        # Draws manual control check boxes for the exact number of Bristles / Cylinders
        # on the machine
        
        Bristles_CheckBox = []
        Cylinders_CheckBox = []
        
        for x in range(0, Bristles):
            Bristles_CheckBox.insert(x, (wx.CheckBox(Bristles_Panel, 501+x, "Bristle %d" % (x+1))) )
            Bristles_Sizer.Add(Bristles_CheckBox[x], 1, wx.ALIGN_CENTER_HORIZONTAL)
        for x in range(0, Cylinders):
            Cylinders_CheckBox.insert(x, (wx.CheckBox(Cylinders_Panel, 601+x, "Cylinder %d" % (x+1))) )
            Cylinders_Sizer.Add(Cylinders_CheckBox[x], 1, wx.ALIGN_CENTER_HORIZONTAL)
        Bristles_Panel.SetSizer(Bristles_Sizer)
        Bristles_Panel.Layout()
        Cylinders_Panel.SetSizer(Cylinders_Sizer)
        Cylinders_Panel.Layout()
        Manual_Control_Sizer.Add(Cylinders_Panel, 1, wx.EXPAND)
        Manual_Control_Sizer.Add(Bristles_Panel, 1, wx.EXPAND)
        
        Manual_Control_Panel.SetSizer(Manual_Control_Sizer)
        Manual_Control_Panel.Layout()
                                 
        
## CONTROL PANEL layout ###
        Control_Sizer.Add(Automatic_Control_Panel, 3, wx.EXPAND | wx.ALL, 1)
        Control_Sizer.Add(Manual_Control_Panel, 2, wx.EXPAND | wx.ALL, 1)
        Control_Panel.SetSizer(Control_Sizer)
        Control_Panel.Layout()
 
### ACTION PANEL ###
        Action_Panel = wx.Panel(Main_Panel)
        Action_Button_Go = wx.Button(Action_Panel, ID_ACTION_BUTTON_GO, "GO")
        Action_Button_Go.SetBackgroundColour('Green')
        #self.Bind(wx.EVT_BUTTON, self.OnEnterGo, Action_Button_Go)
        
        Action_Button_Stop = wx.Button(Action_Panel, ID_ACTION_BUTTON_STOP, "STOP")
        Action_Button_Stop.SetBackgroundColour('Red')
        #self.Bind(wx.EVT_BUTTON, self.OnStop, id=ID_ACTION_BUTTON_STOP)
        Action_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        Action_Sizer.Add(Action_Button_Go, 1, wx.EXPAND | wx.ALL, 1)
        Action_Sizer.Add(Action_Button_Stop, 1, wx.EXPAND | wx.ALL, 1)
        Action_Panel.SetSizer(Action_Sizer)
        Action_Panel.Layout()
        
    
### MAIN SIZER CONTROL ###
                
        Main_Sizer = wx.BoxSizer(wx.VERTICAL)
        Main_Sizer.Add(Title_Panel, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
        Main_Sizer.Add(Control_Panel, 2, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
        Main_Sizer.Add(Action_Panel, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10)
        
        Main_Panel.SetSizer(Main_Sizer)
        Main_Sizer.Fit(self)                # Fit frame to neccessary size
        Main_Sizer.SetSizeHints(self)       # Prevents frame from getting smaller than min.
 

### MENU EVENTS ###
        
    def OnMenuSave(self, event):
        dlg = wx.FileDialog(self, "Save Config File...", os.getcwd(),
                            style = wx.SAVE | wx.CHANGE_DIR | wx.OVERWRITE_PROMPT)
        if dlg.ShowModal() == wx.ID_OK:
            print "Saved"
            wx.Sleep(1)
        dlg.Destroy()
    def OnMenuLoad(self, event):
        dlg = wx.FileDialog(self, "Load Config File...", os.getcwd(),
                            style = wx.OPEN | wx.CHANGE_DIR)
        if dlg.ShowModal() == wx.ID_OK:
            print "Loaded"
            wx.Sleep(1)
        dlg.Destroy()
        
    def OnMenuExit(self, event):
        self.Close()
 
    def OnMenuAbout(self, evt):
        dlg = wx.MessageDialog(self, "DPT - Sequence Driven Controller\n"
                              "Mark Walker 2006/07\n"
                              "Final Year Engineering Project", "Sequence Driven Controller",
                               wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()
        dlg.Destroy()
 
### CONTROLLER DRIVEN EVENTS ###
    def OnSpeedSlider(self, event):
        Speed_Label.SetLabel("Speed = %d" % event.Speed_Slider.GetValue())
    
 
class wxPyApp(wx.App):
    def OnInit(self):
        frame = Frame1(None, "DPT - Sequence Driven Controller")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True
        
app = wxPyApp(redirect=True)
app.MainLoop()

Im pretty sure you are right about the class thing. Just not really sure how to instance / call / define everything i need to.


Thanks again :-)


Mark

I corrected your code in a few places, added a few missing self. prefixes. If you use a widget in one of the class methods, then you have to prefix it with self.

import wx
import os

ID_MENU_NEW_WIZ = 101
ID_MENU_SAVE    = 102
ID_MENU_LOAD    = 103
ID_MENU_EXIT    = 104
ID_MENU_HELP    = 105
ID_MENU_ABOUT   = 106
ID_RADIO_FORWARDS   = 201
ID_RADIO_STATIONARY = 202
ID_RADIO_BACKWARDS  = 203
ID_SPEED_LABEL      = 204    # first time!!!!
ID_SPEED_SLIDER     = 301
#ID_SPEED_LABEL         = 401  # second time!!!!
ID_SPEED_JUDDER_BUTTON = 402
# 501-> Reserved for Bristle manual control checkboxes
# 601-> Reserved for Cylinder manual control checkboxes
ID_ACTION_BUTTON_GO   = 701
ID_ACTION_BUTTON_STOP = 702
Speed = 3
Cylinders = 2
Bristles  = 3
 
class Frame1(wx.Frame): 
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, pos=(150, 150))
        Icon = wx.Icon("icon3.ico", wx.BITMAP_TYPE_ICO)
        self.SetIcon(Icon)
        
### MENU ###
        
        # Create a menubar at the top of the frame
        MenuBar = wx.MenuBar()
        FileMenu = wx.Menu()
        HelpMenu = wx.Menu() 
        # Add items to the menu
        FileMenu.Append(ID_MENU_NEW_WIZ, "&New Tractor Wizard\tCtrl-N", "Start the New Tractor wizard")
        FileMenu.Append(ID_MENU_SAVE, "&Save\tCtrl-S", "Save the current tractor configuration to file")
        FileMenu.Append(ID_MENU_LOAD, "&Load\tCtrl-L", "Open a tractor configuration from file")
        FileMenu.AppendSeparator()
        FileMenu.Append(ID_MENU_EXIT, "E&xit\tAlt-F4", "Exit the program")
        
        HelpMenu.Append(ID_MENU_HELP, "&Help\tF1", "Open the Help file")
        HelpMenu.AppendSeparator()
        HelpMenu.Append(ID_MENU_ABOUT, "&About", "About the program")
 
        # Bind the menu event to an event handler
        self.Bind(wx.EVT_MENU, self.OnMenuSave, id = ID_MENU_SAVE)
        self.Bind(wx.EVT_MENU, self.OnMenuLoad, id = ID_MENU_LOAD)
        self.Bind(wx.EVT_MENU, self.OnMenuExit, id = ID_MENU_EXIT)
        self.Bind(wx.EVT_MENU, self.OnMenuAbout, id = ID_MENU_ABOUT)

        # Put the menu on the menubar
        MenuBar.Append(FileMenu, "&File")
        MenuBar.Append(HelpMenu, "&Help")
        self.SetMenuBar(MenuBar)
        
 
### STATUS BAR ###
        
        self.CreateStatusBar()
 
### MAIN PANEL ###
        
        Main_Panel = wx.Panel(self)
        Main_Panel.SetBackgroundColour((225,245,255))
 
### TITLE PANEL ###
        
        Title_Panel = wx.Panel(Main_Panel)
 
        Title_Label = wx.StaticText(Title_Panel, -1, "Sequence Driven Controller")
        Title_Label.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, True))
        Title_Label.SetForegroundColour('#00009F')
        Title_Image = wx.Image("DPT Image.jpg", wx.BITMAP_TYPE_ANY)
        #Title_Image = wx.Image("Btn_up.JPG", wx.BITMAP_TYPE_ANY)  # for testing!!!!
        Title_Bitmap_Widget = wx.StaticBitmap(Title_Panel, -1, wx.BitmapFromImage(Title_Image))
        Title_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        Title_Sizer.Add(Title_Bitmap_Widget, 1, wx.ALIGN_CENTER)
        Title_Sizer.Add(Title_Label, 4, wx.ALIGN_CENTER | wx.LEFT, 10)
        
        Title_Panel.SetSizer(Title_Sizer)
        Title_Panel.Layout()
 
### CONTROL PANEL setup ###
        Control_Panel = wx.Panel(Main_Panel)
        Control_Sizer = wx.BoxSizer(wx.HORIZONTAL)
 
### AUTOMATIC CONTROL setup ###
        Automatic_Control_Panel = wx.Panel(Control_Panel)
        Automatic_Box = wx.StaticBox(Automatic_Control_Panel, -1, 'Automated Control')
        Automatic_Box.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))
        Automatic_Control_Sizer = wx.StaticBoxSizer(Automatic_Box, wx.VERTICAL)
 
### DIRECTION PANEL ###
        Direction_Panel = wx.Panel(Automatic_Control_Panel)
        
        RadioButtonForwards = wx.RadioButton(Direction_Panel, ID_RADIO_FORWARDS, "Forwards")
        RadioButtonStationary = wx.RadioButton(Direction_Panel, ID_RADIO_STATIONARY, "Stationary")
        RadioButtonBackwards = wx.RadioButton(Direction_Panel, ID_RADIO_BACKWARDS, "Backwards")
        
        Direction_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        Direction_Sizer.Add(RadioButtonForwards, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        Direction_Sizer.Add(RadioButtonStationary, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        Direction_Sizer.Add(RadioButtonBackwards, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
               
        Direction_Panel.SetSizer(Direction_Sizer)
        Direction_Panel.Layout()
 
### SPEED SLIDER & JUDDER ### added a few self. !!!!
        Speed_Slider_Panel = wx.Panel(Automatic_Control_Panel)
                
        self.Speed_Slider = wx.Slider(Speed_Slider_Panel, ID_SPEED_SLIDER, 0, 0, 10,
                                 style = wx.HORIZONTAL | wx.SL_AUTOTICKS)
        self.Speed_Slider.SetTickFreq(1, 1)
        
        self.Bind(wx.EVT_SLIDER, self.OnSpeedSlider, id=ID_SPEED_SLIDER)
        
        Speed_Slider_Sizer = wx.BoxSizer(wx.HORIZONTAL) 
        Speed_Slider_Sizer.Add(self.Speed_Slider, -1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        
        Speed_Slider_Panel.SetSizer(Speed_Slider_Sizer)
        Speed_Slider_Panel.Layout()
 
### SPEED & JUDDER ###
        Speed_Judder_Panel = wx.Panel(Automatic_Control_Panel)
        Speed_Judder_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        self.Speed_Label = wx.StaticText(Speed_Judder_Panel, ID_SPEED_LABEL, "Speed = %d" % Speed)
        self.Speed_Label.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))
        
        Speed_Judder_Button = wx.ToggleButton(Speed_Judder_Panel, ID_SPEED_JUDDER_BUTTON, "Judder")
        Speed_Judder_Sizer.Add(self.Speed_Label, 3, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
        Speed_Judder_Sizer.Add(Speed_Judder_Button, 2, wx.EXPAND | wx.ALL, 2)
        Speed_Judder_Panel.SetSizer(Speed_Judder_Sizer)
        Speed_Judder_Panel.Layout()
 
### AUTOMATIC CONTROL layout ###
        Automatic_Control_Sizer.Add(Direction_Panel, 1, wx.EXPAND)
        Automatic_Control_Sizer.Add(Speed_Slider_Panel, 1, wx.EXPAND)
        Automatic_Control_Sizer.Add(Speed_Judder_Panel, 1, wx.EXPAND)
        Automatic_Control_Panel.SetSizer(Automatic_Control_Sizer)
        Automatic_Control_Sizer.Fit(self)                # Fit frame to neccessary size
        Automatic_Control_Sizer.SetSizeHints(self)       # Prevents frame from getting smaller than min.
        Automatic_Control_Panel.Layout()
 
### MANUAL CONTROL ###
        Manual_Control_Panel = wx.Panel(Control_Panel)
        Bristles_Panel = wx.Panel(Manual_Control_Panel)
        Cylinders_Panel = wx.Panel(Manual_Control_Panel)
        Manual_Box = wx.StaticBox(Manual_Control_Panel, -1, 'Manual Control')
        Manual_Box.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, False))
        Manual_Control_Sizer = wx.StaticBoxSizer(Manual_Box, wx.HORIZONTAL)
        Bristles_Sizer = wx.BoxSizer(wx.VERTICAL)
        Cylinders_Sizer = wx.BoxSizer(wx.VERTICAL)
 
        # Draws manual control check boxes for the exact number of Bristles / Cylinders
        # on the machine
        
        Bristles_CheckBox = []
        Cylinders_CheckBox = []
        
        for x in range(0, Bristles):
            Bristles_CheckBox.insert(x, (wx.CheckBox(Bristles_Panel, 501+x, "Bristle %d" % (x+1))) )
            Bristles_Sizer.Add(Bristles_CheckBox[x], 1, wx.ALIGN_CENTER_HORIZONTAL)
        for x in range(0, Cylinders):
            Cylinders_CheckBox.insert(x, (wx.CheckBox(Cylinders_Panel, 601+x, "Cylinder %d" % (x+1))) )
            Cylinders_Sizer.Add(Cylinders_CheckBox[x], 1, wx.ALIGN_CENTER_HORIZONTAL)
        Bristles_Panel.SetSizer(Bristles_Sizer)
        Bristles_Panel.Layout()
        Cylinders_Panel.SetSizer(Cylinders_Sizer)
        Cylinders_Panel.Layout()
        Manual_Control_Sizer.Add(Cylinders_Panel, 1, wx.EXPAND)
        Manual_Control_Sizer.Add(Bristles_Panel, 1, wx.EXPAND)
        
        Manual_Control_Panel.SetSizer(Manual_Control_Sizer)
        Manual_Control_Panel.Layout()
                                 
        
## CONTROL PANEL layout ###
        Control_Sizer.Add(Automatic_Control_Panel, 3, wx.EXPAND | wx.ALL, 1)
        Control_Sizer.Add(Manual_Control_Panel, 2, wx.EXPAND | wx.ALL, 1)
        Control_Panel.SetSizer(Control_Sizer)
        Control_Panel.Layout()
 
### ACTION PANEL ###
        Action_Panel = wx.Panel(Main_Panel)
        Action_Button_Go = wx.Button(Action_Panel, ID_ACTION_BUTTON_GO, "GO")
        Action_Button_Go.SetBackgroundColour('Green')
        #self.Bind(wx.EVT_BUTTON, self.OnEnterGo, Action_Button_Go)
        
        Action_Button_Stop = wx.Button(Action_Panel, ID_ACTION_BUTTON_STOP, "STOP")
        Action_Button_Stop.SetBackgroundColour('Red')
        #self.Bind(wx.EVT_BUTTON, self.OnStop, id=ID_ACTION_BUTTON_STOP)
        Action_Sizer = wx.BoxSizer(wx.HORIZONTAL)
        Action_Sizer.Add(Action_Button_Go, 1, wx.EXPAND | wx.ALL, 1)
        Action_Sizer.Add(Action_Button_Stop, 1, wx.EXPAND | wx.ALL, 1)
        Action_Panel.SetSizer(Action_Sizer)
        Action_Panel.Layout()
        
    
### MAIN SIZER CONTROL ###
                
        Main_Sizer = wx.BoxSizer(wx.VERTICAL)
        Main_Sizer.Add(Title_Panel, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
        Main_Sizer.Add(Control_Panel, 2, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
        Main_Sizer.Add(Action_Panel, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10)
        
        Main_Panel.SetSizer(Main_Sizer)
        Main_Sizer.Fit(self)                # Fit frame to neccessary size
        Main_Sizer.SetSizeHints(self)       # Prevents frame from getting smaller than min.
 
 
### MENU EVENTS ###
        
    def OnMenuSave(self, event):
        dlg = wx.FileDialog(self, "Save Config File...", os.getcwd(),
                            style = wx.SAVE | wx.CHANGE_DIR | wx.OVERWRITE_PROMPT)
        if dlg.ShowModal() == wx.ID_OK:
            print "Saved"
            wx.Sleep(1)
        dlg.Destroy()
        
    def OnMenuLoad(self, event):
        dlg = wx.FileDialog(self, "Load Config File...", os.getcwd(),
                            style = wx.OPEN | wx.CHANGE_DIR)
        if dlg.ShowModal() == wx.ID_OK:
            print "Loaded"
            wx.Sleep(1)
        dlg.Destroy()
        
    def OnMenuExit(self, event):
        self.Close()
 
    def OnMenuAbout(self, evt):
        dlg = wx.MessageDialog(self, "DPT - Sequence Driven Controller\n"
                              "Mark Walker 2006/07\n"
                              "Final Year Engineering Project", "Sequence Driven Controller",
                               wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()
        dlg.Destroy()
 
### CONTROLLER DRIVEN EVENTS ###  added a few self. !!!!
    def OnSpeedSlider(self, event):
        self.Speed_Label.SetLabel("Speed = %d" % self.Speed_Slider.GetValue())
    
 
class wxPyApp(wx.App):
    def OnInit(self):
        frame = Frame1(None, "DPT - Sequence Driven Controller")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True
        
#app = wxPyApp(redirect=True)
app = wxPyApp(redirect=False)  # so error messages will show up in DrPython
app.MainLoop()
Comments
Massively helpful! Thankyou!

You are an absolutle legend!

Thankyou SO much! :-)

Is it good practice in that case to preceed any widget with 'self'?

I think i have failed to realise the significance of 'self' when teaching myself the language.

Once again, thankyou :-)


Mark

Well, you can print self and in your code find out that it is simply the instance __main__.Frame1 . Blindly putting 'self.' in front of every variable would be an overkill. It only is needed if there has to be a reference to a particular instance, or you want to use that variable in one of your class methods. Remember, methods are functions within the class and they always start with argument self.

This question has already been answered. Start a new discussion instead.