Меню правой кнопки мыши Python Gtk3

Я пытаюсь создать всплывающее меню в python/gtk3. До сих пор я пробовал следующий код:

from gi.repository import Gtk
def show_menu(self, *args):     
    menu = Gtk.Menu()
    i1 = Gtk.MenuItem("Item 1")
    menu.append(i1)
    i2 = Gtk.MenuItem("Item 2")
    menu.append(i2)
    i2.show()    
    i1.show()
    menu.popup(None, None, None, None, 0, Gtk.get_current_event_time())
    print("Done")


window = Gtk.Window() 
button = Gtk.Button("Create pop-up") 
button.connect("clicked", show_menu) 
window.add(button) 
window.show_all()
Gtk.main()

но всплывающее меню не появляется? Что я делаю не так?


person Ali Rasim Kocal    schedule 22.02.2014    source источник


Ответы (2)


Поскольку menu является локальной переменной в функции show_menu() и на нее больше ничего не ссылается, ее счетчик ссылок падает до 0, и она уничтожается в конце функции; к сожалению, это правильно, когда вы ожидаете увидеть это.

Вместо этого создайте menu в глобальной области видимости, чтобы menu больше не было локальным для одной функции и не уничтожалось в конце функции.

from gi.repository import Gtk

def show_menu(self, *args):
    i1 = Gtk.MenuItem("Item 1")
    menu.append(i1)
    i2 = Gtk.MenuItem("Item 2")
    menu.append(i2)
    menu.show_all()
    menu.popup(None, None, None, None, 0, Gtk.get_current_event_time())
    print("Done")

window = Gtk.Window()
button = Gtk.Button("Create pop-up")
menu = Gtk.Menu()
button.connect("clicked", show_menu)
window.connect('destroy', Gtk.main_quit)
window.add(button)
window.show_all()
Gtk.main()
person ptomato    schedule 23.02.2014
comment
спасибо, я думал проблема в Gtk. Судя по всему, это не так. - person Ali Rasim Kocal; 24.02.2014

В обратном вызове выполните menu.attach_to_widget (widget, None). Вместо *args может быть проще просто предоставить правильные аргументы обратному вызову, который, как я полагаю, в этом случае будет просто `show_menu(self, widget, user_data)'.

attach_to_widget в основном передает ответственность за меню GtkWindow, включая всю очистку, позиционирование и т. д.

person mtwebster    schedule 06.04.2014