[sugar] Bug in pygtk RadioAction

Don Hopkins dhopkins at DonHopkins.com
Tue May 8 03:23:13 EDT 2007


(I've filed the following bugs against gtk/pygtk):

http://bugzilla.gnome.org/show_bug.cgi?id=436796

Apparently a RadioAction does not create the documented classes 
RadioMenuItem when you call create_menu_item(), and RadioToolButton when 
you call create_tool_item(). Instead of a RadioMenuItem it creates a 
RadioToggleItem, and instead of RadioToolItem it creates a CheckMenuItem.

I discovered this issue when I tried to create my own subclass of 
RadioAction called SugarRadioAction and went 
SugarRadioAction.set_tool_item_type(SugarRadioToolButton) so it would 
make my own subclass of gtk.RadioToolButton. Unfortunately it did not 
work when my SugarRadioToolButton was a subclass of gtk.RadioToolButton 
-- it selected all the buttons at once and never let me deselect them, 
instead of only having one selected at once like a good radio button 
set. But I noticed that normal RadioActions were actually creating 
gtk.ToggleToolButton's instead of gtk.RadioToolButton's, so I changed 
SugarRadioButton to subclass gtk.ToggleToolButton instead of 
gtk.RadioToolButton, and suddenly it started working correctly!

Here is the documentation for pygtk's Radio Actions, which incorrectly 
states the corresponding proxy widgets are RadioMenuItem and 
RadioToolButton. The gtk+ documentation itself is more vague, just 
muttering something about how RadioAction is similar to RadioMenuItem, 
but not specifying which proxy classes RadioAction actually makes.

http://www.pygtk.org/pygtk2tutorial/ch-NewInPyGTK2.4.html

    16.1.1.7. Radio Actions

    A RadioAction is a subclass of ToggleAction that can be grouped so 
that only one RadioAction is active at a time. The corresponding proxy 
widgets are the RadioMenuItem and RadioToolButton.

http://www.pygtk.org/docs/pygtk/class-gtkradioaction.html

    A gtk.RadioAction is a subclass of gtk.ToggleAction and similar to 
gtk.RadioMenuItem. A number of radio actions can be linked together so 
that only one may be active at any one time.

Here is a minimal test program that demonstrates the problem, followed 
by its output.

    -Don

########################################################################
# gtk_action_bug.py
# Don Hopkins (dhopkins at DonHopkins.com)


import gtk

# Test ToggleAction, which works as documented.

toggle_action = gtk.ToggleAction('a', 'label', None, None)
print "Made toggle_action", toggle_action

toggle_tool_item = toggle_action.create_tool_item()
print "toggle_action.create_tool_item() RETURNED", toggle_tool_item, "SHOULD BE", gtk.ToggleToolButton, "AND IT IS!"

toggle_menu_item = toggle_action.create_menu_item()
print "toggle_action.create_menu_item RETURNED", toggle_menu_item, "SHOULD BE", gtk.CheckMenuItem, "AND IT IS!"

# Test RadioAction, which does not work as documented.

radio_action = gtk.RadioAction('a', 'label', None, None, 1)
print "Made radio_action", radio_action

radio_tool_item = radio_action.create_tool_item()
print "radio_action.create_tool_item() RETURNED", radio_tool_item, "SHOULD BE", gtk.RadioToolButton, "BUT IT IS NOT!!!"

radio_menu_item = radio_action.create_menu_item()
print "radio_action.create_menu_item() RETURNED", radio_menu_item, "SHOULD BE", gtk.RadioMenuItem, "BUT IT IS NOT!!!"



# Output:
"""
Made toggle_action <gtk.ToggleAction object at 0xb7ec8be4 (GtkToggleAction at 0xa020d10)>
toggle_action.create_tool_item() RETURNED <gtk.ToggleToolButton object at 0xb7ec85cc (GtkToggleToolButton at 0xa030810)> SHOULD BE <type 'gtk.ToggleToolButton'> AND IT IS!
toggle_action.create_menu_item RETURNED <gtk.CheckMenuItem object at 0xb7ec8824 (GtkCheckMenuItem at 0xa021570)> SHOULD BE <type 'gtk.CheckMenuItem'> AND IT IS!
Made radio_action <gtk.RadioAction object at 0xb7ec884c (GtkRadioAction at 0xa03d808)>
radio_action.create_tool_item() RETURNED <gtk.ToggleToolButton object at 0xb7ec8dc4 (GtkToggleToolButton at 0xa030940)> SHOULD BE <type 'gtk.RadioToolButton'> BUT IT IS NOT!!!
radio_action.create_menu_item() RETURNED <gtk.CheckMenuItem object at 0xb7ec8dec (GtkCheckMenuItem at 0xa0215d8)> SHOULD BE <type 'gtk.RadioMenuItem'> BUT IT IS NOT!!!


"""




More information about the Sugar mailing list