This is a follow up to my last mail, with the subject "emulate Live Bookmarks buttons?"
I've made some progress in creating this "Menu Button" widget, but have met some hangups. The Live Bookmarks buttons I was referring to previously, by the way, are XUL entities described here: http://developer.mozilla.org/en/XUL/PopupGuide/MenuButtons#The_%27menu%27_button In PyGTK I have connected a popup menu to a Toggle Button. When the popup menu disappears, I would like the Toggle Button to bounce back to an "un-pressed" state. To accomplish this, I connect a callback to the "deactivate" signal of the menu, passing a reference to the button, and then call button.set_active(False). This works OK, except for the fact that the "deactivate" signal gets emitted twice. I normally wouldn't mind this peculiarity, since calling set_active(False) a second time has no additional effect. However, a warning arises if I trigger "activate" callbacks from the MenuItem's. Upon the second emssion of the "deactivate" signal, its callback produces this: ./menu_toolbutton.py:53: GtkWarning: gtk_toggle_tool_button_set_active: assertion `GTK_IS_TOGGLE_TOOL_BUTTON (button)' failed button.set_active(False) Upon further investigation, the reference to "button" prints out as this: button = <gtk.ToggleToolButton object at 0x826fcd4 (uninitialized at 0x0)> I have found that the "button" argument gets corrupted in this way when I do significant "work" (such as importing opencv) in the "activate" callback. I've posted code that produces this effect below. Please let me know if you can reproduce this, and any workarounds you can think of. Karl #!/usr/bin/python from pygtk import require require('2.0') import gtk class Playground(gtk.Window): def __init__(self): gtk.Window.__init__( self, gtk.WINDOW_TOPLEVEL ) vbox = gtk.VBox(False) self.add(vbox) vbox.set_size_request(100, -1) toolbar = gtk.Toolbar() toolbutton = gtk.ToolButton() toggle_button = gtk.ToggleToolButton(gtk.STOCK_ADD) toolbar.insert(toggle_button, -1) menu = gtk.Menu() video_source_options = ["Milk", "Cookies"] [menu.append(gtk.MenuItem(video_source)) for video_source in video_source_options] for i, child in enumerate(menu.get_children()): child.connect("activate", self.cb_menu_activate, video_source_options[i]) menu.show_all() toggle_button.connect( "clicked", self.popup_cb, menu ) menu.connect( "deactivate", self.deactivate_cb, toggle_button ) vbox.pack_start(toolbar, False, False) self.show_all() def cb_menu_activate(self, menu, child_index): import opencv # import cairo print "Activated item", child_index def deactivate_cb(self, menu, button): print "Button object:", button button.set_active(False) def popup_cb(self, widget, menu): menu.popup(None, None, None, 1, 0) if __name__ == "__main__": application = Playground() gtk.main()
_______________________________________________ pygtk mailing list [email protected] http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
