2011-06-26 2 views
10

im пытается перенести некоторые небольшие примеры из PyGTK в новые привязки PyGobject, но ive попал в блокпост с всплывающим меню, несмотря на отсутствие ошибок, в меню справа не отображается меню, вот код ,Gtk.StatusIcon PopupMenu in python

from gi.repository import Gtk 
class aStatusIcon: 
    def __init__(self): 
     self.statusicon = Gtk.StatusIcon() 
     self.statusicon.set_from_stock(Gtk.STOCK_HOME) 
     self.statusicon.connect("popup-menu", self.right_click_event) 

     window = Gtk.Window() 
     window.connect("destroy", lambda w: Gtk.main_quit()) 
     window.show_all() 

    def right_click_event(self, icon, button, time): 
     menu = Gtk.Menu() 

     about = Gtk.MenuItem() 
     about.set_label("About") 
     quit = Gtk.MenuItem() 
     quit.set_label("Quit") 

     about.connect("activate", self.show_about_dialog) 
     quit.connect("activate", Gtk.main_quit) 

     menu.append(about) 
     menu.append(quit) 

     menu.show_all() 

     #menu.popup(None, None, gtk.status_icon_position_menu, button, time, self.statusicon) # previous working pygtk line 
     menu.popup(None, None, None, Gtk.StatusIcon.position_menu, button, time) #i assume this is problem line 

    def show_about_dialog(self, widget): 
     about_dialog = Gtk.AboutDialog() 

     about_dialog.set_destroy_with_parent(True) 
     about_dialog.set_name("StatusIcon Example") 
     about_dialog.set_version("1.0") 
     about_dialog.set_authors(["Andrew Steele"]) 

     about_dialog.run() 
     about_dialog.destroy() 

aStatusIcon() 
Gtk.main() 

я предполагаю, что проблема им не говорит о меню self.statusicon там, но он не работает ни в одном из аргументов, так как все они хотят виджет ARG или ничего, а не statusicon, любой умный У ppl появилась идея, где я ошибаюсь?

+0

Я даже не вижу 'StatusIcon.position_menu' в документации для' Gtk.StatusIcon'. Я вижу ['gtk.status_icon_position_menu'] (http://www.pygtk.org/docs/pygtk/class-gtkstatusicon.html#function-gtk--status-icon-position-menu), который явно принимает статус StatusIcon '. Разве это не работает? (Связанный с вами вопрос: вы [Hairy_Palms] (http://ubuntuforums.org/showthread.php?t=1789358)? Вам не обязательно отвечать на этот вопрос.) – senderle

+0

StatusIcon.position_menu - это новый способ обнаружения gtk3 для вызова gtk .status_icon_position_menu, который жалуется, если я попытаюсь дать ему statusicon так, как я сделал для старого метода. (Ответ на этот вопрос: Да :)) – Mike

+0

@Mike, ладно, извините. Прошло некоторое время с тех пор, как я использовал pygtk ... Я предполагаю, что мой подход состоял бы в том, чтобы написать мою собственную функцию позиционирования, которая будет принимать «StatusIcon», вызывать ['StatusIcon.get_geometry()'] (http: //www.pygtk. org/docs/pygtk/class-gtkstatusicon.html # method-gtkstatusicon - get-geometry) и верните ['(x, y, push_in)'] (http://www.pygtk.org/docs/pygtk /class-gtkmenu.html#method-gtkmenu--popup). Но это WAG и предполагает, что эти функции не изменились. (Кстати, подпись 'menu.popup' действительно изменилась, как показывает ваш код? Это похоже на серьезный разрыв API, если это так.) – senderle

ответ

16

ah наконец-то, если у кого-то еще есть эта проблема, она была решена благодаря некоторой удивительной помощи одного из парней на gimpnet # python, который вам нужно, чтобы сохранить ваше меню в области видимости или он получает сбор мусора, следовательно, нет ошибок, но нет меню либо это рабочий код

from gi.repository import Gtk 

class aStatusIcon: 
    def __init__(self): 
     self.statusicon = Gtk.StatusIcon() 
     self.statusicon.set_from_stock(Gtk.STOCK_HOME) 
     self.statusicon.connect("popup-menu", self.right_click_event) 

     window = Gtk.Window() 
     window.connect("destroy", lambda w: Gtk.main_quit()) 
     window.show_all() 

    def right_click_event(self, icon, button, time): 
     self.menu = Gtk.Menu() 

     about = Gtk.MenuItem() 
     about.set_label("About") 
     quit = Gtk.MenuItem() 
     quit.set_label("Quit") 

     about.connect("activate", self.show_about_dialog) 
     quit.connect("activate", Gtk.main_quit) 

     self.menu.append(about) 
     self.menu.append(quit) 

     self.menu.show_all() 

     def pos(menu, icon): 
       return (Gtk.StatusIcon.position_menu(menu, icon)) 

     self.menu.popup(None, None, pos, self.statusicon, button, time) 

    def show_about_dialog(self, widget): 
     about_dialog = Gtk.AboutDialog() 

     about_dialog.set_destroy_with_parent(True) 
     about_dialog.set_name("StatusIcon Example") 
     about_dialog.set_version("1.0") 
     about_dialog.set_authors(["Andrew Steele"]) 

     about_dialog.run() 
     about_dialog.destroy() 

aStatusIcon() 
Gtk.main() 
+0

Это не работает. :( – Erigami

+1

Кажется, что некоторые вещи изменились в pygobject, функция pos теперь получает только два аргумента из события, плохо поставил обновленный ответ на http://pastebin.com/Rzek336p, так как stackoverflow, похоже, тоже вставляет углубление – Mike

+0

Я редактировал встроенный код, чтобы изменить ваш pastebin.Похоже, вы использовали сочетание вкладок и пробелов, что могло бы быть причиной того, что SO испортил ваше форматирование. –

0

Копирование Mike's solution сверху с некоторыми незначительными уборок и исправления для новой GTK3:

#!/usr/bin/python3 
import gi 
gi.require_version('Gtk', '3.0') 

from gi.repository import Gtk 

class MyStatusIconApp: 
    def __init__(self): 
     self.status_icon = Gtk.StatusIcon() 
     self.status_icon.set_from_stock(Gtk.STOCK_HOME) 
     self.status_icon.connect("popup-menu", self.right_click_event) 

    def right_click_event(self, icon, button, time): 
     self.menu = Gtk.Menu() 

     about = Gtk.MenuItem() 
     about.set_label("About") 
     about.connect("activate", self.show_about_dialog) 
     self.menu.append(about) 

     quit = Gtk.MenuItem() 
     quit.set_label("Quit") 
     quit.connect("activate", Gtk.main_quit) 
     self.menu.append(quit) 

     self.menu.show_all() 

     self.menu.popup(None, None, None, self.status_icon, button, time) 

    def show_about_dialog(self, widget): 
     about_dialog = Gtk.AboutDialog() 

     about_dialog.set_destroy_with_parent(True) 
     about_dialog.set_name("StatusIcon Example") 
     about_dialog.set_version("1.0") 
     about_dialog.set_authors(["Andrew Steele"]) 

     about_dialog.run() 
     about_dialog.destroy() 

app = MyStatusIconApp() 
Gtk.main() 

(Вы можете обновить, если изменения GTK снова)

Смежные вопросы