On 6/06/2010 11:39 AM, Lang Hurst wrote:
I'm trying to create an incredibly simple application just to learn gui
programming, but I can't see how to work with radio buttons.

Attached find a simple application that uses radio buttons.
tested on windows XP with

Python   version  2.6.3
GTK+   version  2.16.6
pyGTK  version  2.12.1
gobject  version  2.14.2
cairo   version  1.4.12

Used Glade 3.6.1

Hope it works for you and helps answer some of your questions, feel free to ask questions.
Good luck

- Steve
(lets see if attachments get through)

<?xml version="1.0"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="winapp">
    <signal name="destroy" handler="on_winapp_destroy"/>
    <child>
      <object class="GtkHBox" id="hbox1">
        <property name="visible">True</property>
        <property name="spacing">2</property>
        <child>
          <object class="GtkVButtonBox" id="vbuttonbox1">
            <property name="visible">True</property>
            <property name="layout_style">spread</property>
            <child>
              <object class="GtkRadioButton" id="red_rbtn">
                <property name="label" translatable="yes">Red</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="yalign">0.50999999046325684</property>
                <property name="active">True</property>
                <property name="draw_indicator">True</property>
                <signal name="toggled" handler="on_red_rbtn_toggled"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkRadioButton" id="blue_rbtn">
                <property name="label" translatable="yes">Blue</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="active">True</property>
                <property name="draw_indicator">True</property>
                <property name="group">red_rbtn</property>
                <signal name="toggled" handler="on_blue_rbtn_toggled"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkRadioButton" id="green_rbtn">
                <property name="label" translatable="yes">Green</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="active">True</property>
                <property name="draw_indicator">True</property>
                <property name="group">red_rbtn</property>
                <signal name="toggled" handler="on_green_rbtn_toggled"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">2</property>
              </packing>
            </child>
            <child>
              <object class="GtkRadioButton" id="yellow_rbtn">
                <property name="label" translatable="yes">Yellow</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="active">True</property>
                <property name="draw_indicator">True</property>
                <property name="group">red_rbtn</property>
                <signal name="toggled" handler="on_yellow_rbtn_toggled"/>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">3</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkVBox" id="vbox1">
            <property name="visible">True</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkFrame" id="frame1">
                <property name="visible">True</property>
                <property name="label_xalign">0</property>
                <child>
                  <object class="GtkAlignment" id="alignment1">
                    <property name="visible">True</property>
                    <property name="left_padding">12</property>
                    <child>
                      <object class="GtkLabel" id="color_lbl">
                        <property name="visible">True</property>
                        <property name="label" translatable="yes">Unknown</property>
                      </object>
                    </child>
                  </object>
                </child>
                <child type="label">
                  <object class="GtkCheckButton" id="showoutput_btn">
                    <property name="label" translatable="yes">Show Color Choice</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">False</property>
                    <property name="draw_indicator">True</property>
                    <signal name="toggled" handler="on_showoutput_btn_toggled"/>
                  </object>
                </child>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="padding">5</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">False</property>
            <property name="padding">5</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>
try:
    print 'Trying import pygtk',
    import pygtk
    print '...OK'
    print 'Trying version(2.0)',
    pygtk.require("2.0")
    print '...success'
except:
    print '...failure'

try:
    print 'Trying import gtk',
    import gtk
    import gobject
    print '...success'
except:
    print '...failure'
    sys.exit(1)
print

import pango

class appGUI(gobject.GObject):
    def __init__(self):
        gobject.GObject.__init__(self)
        self.builder = gtk.Builder()
        self.builder.add_from_file('buttons.glade')
        self.window = self.builder.get_object('winapp')
        self.color_lbl = self.builder.get_object('color_lbl')
        self.builder.connect_signals(self)
        
        fontdesc = pango.FontDescription("Sans 20")
        self.color_lbl.modify_font(fontdesc)

        self.color_lookup = {
                                'red':       gtk.gdk.Color(red=65535),
                                'blue':     gtk.gdk.Color(blue=65535),
                                'green':    gtk.gdk.Color(green=65535),
                                'yellow':    gtk.gdk.color_parse('yellow')
                                }
        self.on_showoutput_btn_toggled(self.builder.get_object('showoutput_btn'))
        
        
    def on_winapp_destroy(self, widget, data=None):
        '''When our window is destroyed, we want to break out of the GTK main loop. 
        We do this by calling gtk_main_quit()'''
        # do other things here upon close down?
        gtk.main_quit()
        
    def print_radiobutton_state(self, widget):
        if widget.get_active():
            state = 'active'
            if self.builder.get_object('showoutput_btn').get_active():
                self.set_color_label(widget.get_label())
            else:
                self.color_lbl.set_label('Unknown')
                
        else:
            state = 'inactive'
        print '   %s button toggled - now %s ' % ( widget.get_label(), state)
        
    def on_red_rbtn_toggled(self, widget, data=None):
        print 'on_red_rbtn_toggled'
        self.print_radiobutton_state(widget)
        
    def on_blue_rbtn_toggled(self, widget, data=None):
        print 'on_blue_rbtn_toggled'
        self.print_radiobutton_state(widget)
    
    def on_green_rbtn_toggled(self, widget, data=None):
        print 'on_green_rbtn_toggled'
        self.print_radiobutton_state(widget)
    
    def on_yellow_rbtn_toggled(self, widget, data=None):
        print 'on_yellow_rbtn_toggled'
        self.print_radiobutton_state(widget)

    def on_showoutput_btn_toggled(self, widget, data=None):
        if widget.get_active():
            self.color_lbl.set_sensitive(True)
        else:
            self.color_lbl.set_sensitive(False)
            
    
    def set_color_label(self, color):
        self.color_lbl.set_label(color)
        mycolor = self.color_lookup[color.lower()]
        self.color_lbl.modify_fg(gtk.STATE_NORMAL, mycolor)
        
    # Run main application window
    def main(self):
        self.window.show()
        gtk.main()
          
gobject.type_register(appGUI)

if __name__ == "__main__":
    app = appGUI()
    app.main()        
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to