2011-03-10 67 views
0

我正試圖在我的程序中顯示系統托盤圖標。 當我開始我的程序它顯示窗口,當我撞窗口它被隱藏。 然後,如果我點擊系統托盤圖標,它會顯示我一個空白窗口,但不是窗口的內容。爲什麼會發生這種情況? 繼承人的我的代碼:pygtk系統托盤圖標不起作用

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() 

當我點擊系統托盤圖標,它顯示我的窗口,而是一個空白窗口。

所以請幫助我。 謝謝先進。

回答

2

你必須處理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() 
+0

微調:你不需要再處理「摧毀」了。 – 2011-03-12 07:44:45

+0

是的,我沒有注意到這一點。固定。 – saeedgnu 2011-03-12 08:42:04

+0

'tray_activate'中不需要'show_all()'(因爲有一次'__init__'中調用了show_all'),'show()'就足夠了,除非present()更好。 – saeedgnu 2011-03-13 05:45:20

1

我沒有看到你窗口上的任何控件,我想你只是從你的代碼片段中刪除了這段代碼。看看下面的代碼是否適合你。每次點擊托盤圖標時它都會打開一個窗口。還有一個彈出式菜單被註冊爲托盤。

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()