【问题标题】:pygtk system tray icon doesn't workpygtk 系统托盘图标不起作用
【发布时间】:2011-03-10 19:58:26
【问题描述】:

我正在尝试在我的程序中显示系统托盘图标。 当我启动我的程序时,它显示窗口,当我关闭窗口时,它被隐藏。 然后,如果我单击系统托盘图标,它会显示一个空白窗口,但不是窗口的内容。为什么会发生这种情况? 这是我的代码:

class Main(gtk.Window):

    def __init__(self):
        super(Main,self).__init__()
        self.set_title("Virtual Machine Monitor")
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_default_size(640,600)
        self.set_geometry_hints(min_width=640,min_height=600)
        self.set_icon_from_file("../images/activity_monitor2.png")
        self.connect("destroy",self.window_destroy)
        menubar = self.add_menubar()

        pixbuf = gdk.pixbuf_new_from_file_at_size("../images/activity_monitor2.png",25,25)
        statusicon = gtk.StatusIcon()
        statusicon = gtk.status_icon_new_from_pixbuf(pixbuf)
        statusicon.connect("activate",self.tray_activate)
        self.show_all()

    def tray_activate(self,widget):
        self.show_all()

    def window_destroy(self,widget):
        self.hide_all()

if __name__ == "__main__":
    Main()
    gtk.main()

当我点击系统托盘图标时,它会显示一个窗口,但是一个空白窗口。

所以请帮帮我。 提前致谢。

【问题讨论】:

    标签: gtk pygtk trayicon


    【解决方案1】:

    您必须处理 delete-event 才能隐藏窗口而不破坏它(默认情况下)。

    class Main(gtk.Window):
    
        def __init__(self):
            super(Main, self).__init__()
            self.connect('delete-event', self.on_delete_event)
            self.set_title("Virtual Machine Monitor")
            self.set_position(gtk.WIN_POS_CENTER)
            self.set_default_size(640,600)
            self.set_geometry_hints(min_width=640, min_height=600)
            self.set_icon_from_file("../images/activity_monitor2.png")
            menubar = self.add_menubar()
    
            pixbuf = gdk.pixbuf_new_from_file_at_size("../images/activity_monitor2.png",25,25)
            statusicon = gtk.StatusIcon()
            statusicon = gtk.status_icon_new_from_pixbuf(pixbuf)
            statusicon.connect("activate",self.tray_activate)
            self.show_all()
    
        def on_delete_event(self, widget, event):
            self.hide()
            return True    
    
        def tray_activate(self, widget):
            self.present()
    
    
    if __name__ == "__main__":
        Main()
        gtk.main()
    

    【讨论】:

    • 小修正:你不需要再处理“破坏”了。
    • 是的,我没注意。固定。
    • 并且在tray_activate 中不需要show_all()(因为有一次在__init__ 中调用了show_all)并且show() 就足够了,除非present() 更好。
    【解决方案2】:

    我在你的窗口上看不到任何控件,我猜你只是从你的 sn-p 中删除了这段代码。看看下面的代码是否适合你。每次单击托盘图标时,它都会打开一个窗口。还会为托盘注册一个弹出菜单。

    import sys
    import gtk
    
    class MainWindow(gtk.Window):
        def __init__(self):
            super(MainWindow, self).__init__()
    
            self.set_title("Virtual Machine Monitor")
            self.set_position(gtk.WIN_POS_CENTER)
            self.set_default_size(640, 600)
            self.set_geometry_hints(min_width=640, min_height=600)
            self.set_icon_from_file("../images/activity_monitor2.png")
            self.connect("destroy", self.window_destroy)
    
            box = gtk.VBox()
            button = gtk.Button("Test Button")
            box.pack_start(button, False)
            self.add(box)
    
            self.show_all()
    
        def window_destroy(self,widget):
            self.hide_all()
    
    class TrayIcon(gtk.StatusIcon):
        def __init__(self):
            gtk.StatusIcon.__init__(self)
    
            # using a stock icon, load your pixmap here
            self.set_from_stock(gtk.STOCK_FIND)
            self.set_tooltip('Tracker Desktop Search')
            self.set_visible(True)
    
            self.menu = menu = gtk.Menu()
    
            window_item = gtk.MenuItem("Show Window")
            window_item.connect("activate", self.show_window, "about")
            menu.append(window_item)
    
            quit_item = gtk.MenuItem("Quit")
            quit_item.connect("activate", self.quit, "file.quit")
            menu.append(quit_item)
            menu.show_all()
    
            self.connect("activate", self.show_window)
            self.connect('popup-menu', self.icon_clicked)
    
        def show_window(self, widget, event=None):
            MainWindow()    
    
        def icon_clicked(self, status, button, time):
            self.menu.popup(None, None, None, button, time)
    
        def quit(self, widget, event=None):
            sys.exit(0)
    
    if __name__ == "__main__":
        TrayIcon() 
        gtk.main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2012-08-30
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多