Hi, I'm a little new to pygtk; I am only about a month or so in. I'm trying to create a favorites, or bookmarks menu for an application. What I'm trying to do is have it so when the user right clicks the item, a menu pops up over the item with "rename" and "delete."

I'm having problems keeping the favorites menu open on a right-click. I also can not make the pop-up menu appear. I am not sure whether the first problem causes the second one or not.

Below is some source which shows my attempts. I've already figured out how to deal with right and left clicks.

The below code is standalone. It works by itself, so you can just try it out yourself, and it'll work (mostly). What it's lacking is that it doesn't make the menu pop up and it closes the favorites menu after right-clicking a button.

As you can see below, I've created the popup menu and tried to implement it. But I have no idea where to start as to not closing the favorites menu after one of its items is right clicked.

Can anyone help me with this? How do I fix this so that, when an item on the menu is right-clicked, the menu stays open, and the popup "rename/delete" menu appears?

---CODE BELOW---

import gtk

#make window
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
box = gtk.VBox()
window.add(box)

#create menubar, menubutton
menu_bar = gtk.MenuBar()
bookmarkbutton = gtk.MenuItem("bookmarks")
menu_bar.append(bookmarkbutton)

#the variable used to hold the kind of mouse click
mousebutton = 0

def get_button(menu, event):
'''When a click is detected on the favorites menu, see which kind it is'''
   global mousebutton
   mousebutton = event.button

def bookmark_select(bookmark, menu, mousebutton):
'''when the bookmark is actually activated, depending on the kind of click used, take different actions'''
   def printer(text='a'):
       print text
if mousebutton == 1 or mousebutton == 2: '''if the user clicked the item with their left or middle mouse button'''
       print "Left clicked " + bookmark.label
   elif mousebutton == 3:
       '''if the user clicked the item with their right mouse button'''
print "Right clicked " + bookmark.label + ", favorites menu should stay open, and a popup menu should appear over it with 'rename' and 'delete'."
       popup_menu = gtk.Menu()
       rename_bookmark = gtk.MenuItem('rename ' + bookmark.label)
rename_bookmark.connect_object('activate', printer, 'You clicked "rename %s"' % (bookmark.label))
       delete_bookmark = gtk.MenuItem('delete ' + bookmark.label)
delete_bookmark.connect_object('activate', printer, 'You clicked "delete %s"' % (bookmark.label))
       popup_menu.append(rename_bookmark)
       popup_menu.append(delete_bookmark)
       popup_menu.popup(menu, bookmark, None, mousebutton, 2)
       popup_menu.show()
       rename_bookmark.show()
       delete_bookmark.show()

#Create the menu, connect clicks on it to the get_button function. Add it to the bookmark button.
menu = gtk.Menu()
menu.add_events(gtk.gdk.BUTTON_PRESS_MASK)
menu.connect('button_press_event', get_button)
bookmarkbutton.set_submenu(menu)

#Make items on the menu. Connect activations of them to a function which performs different tasks depending on right or left click.
menu_items = []
for i in range(0, 3):
   menu_items.insert(i, gtk.MenuItem("bookmark " + str(i)))
   menu_items[i].label = menu_items[i].get_child().get_label()
menu_items[i].connect('activate', lambda x: bookmark_select(x, menu, mousebutton))
   menu.append(menu_items[i])

#show everything
window.show()
box.pack_start(menu_bar, expand=False, fill=False)
box.show()
menu_bar.show()
bookmarkbutton.show()
menu.show()
for i in menu_items:
   i.show()

gtk.main()


---CODE ABOVE---

Thanks for any help.
-Nate
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to