2013-10-25 77 views
0

我有一個普通的gtk.MenuBar下面的框架。每當鼠標懸停在一個物品上,並且該子菜單由於失去焦點而被隱藏時,在重新訪問該子菜單時,所有物品都將丟失。Gtk MenuBar殺死指針懸停在它們上方的MenuItems後

預期的行爲是菜單項重新出現的順序是它們被添加到它們的菜單和子菜單,每次使用指針激活「文件」,「遊戲」和「幫助」。

這種感知錯誤的原因是什麼? gtk.MenuBar是否需要更多「實施」才能正常工作?

不期望的結果如下圖所示:

pre-hover post-hover

#!/usr/bin/python 
import gtk 

def callbackz(*argv): 
    print str(*argv) 

class ChessMenuBar(gtk.MenuBar): 
    def __init__(self): 
     super(ChessMenuBar, self).__init__() 

     menu_file = gtk.Menu() 

     item_open = gtk.MenuItem('Open') 
     item_save = gtk.MenuItem('Save') 
     item_quit = gtk.MenuItem('Quit') 
     menu_file.append(item_open) 
     menu_file.append(item_save) 
     menu_file.append(item_quit) 

     menu_game = gtk.Menu() 
     item_newg = gtk.MenuItem('Star New Game') 
     menu_game.append(item_newg) 

     menu_help = gtk.Menu() 
     item_help = gtk.MenuItem('Help') 
     menu_help.append(item_help) 

     # -- main categories 
     item_file = gtk.MenuItem('File') 
     item_game = gtk.MenuItem('Game') 
     item_help = gtk.MenuItem('Help') 

     item_file.set_submenu(menu_file) 
     item_game.set_submenu(menu_game) 
     item_help.set_submenu(menu_help) 

     self.append(item_file) 
     self.append(item_game) 
     self.append(item_help) 


     for _ in [ item_file, item_game, item_help, 
       item_help, item_newg, item_open, 
       item_quit, item_save]: 
      _.connect('activate', callbackz) 

class PyApp(gtk.Window): 

    def __init__(self): 
     super(PyApp, self).__init__() 

     self.set_title("Simple menu") 
     self.set_size_request(250, 200) 
     self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440)) 
     self.set_position(gtk.WIN_POS_CENTER) 

     mb = ChessMenuBar() 

     vbox = gtk.VBox(False, 2) 
     vbox.pack_start(mb, False, False, 0) 

     self.add(vbox) 

     self.connect("destroy", gtk.main_quit) 
     self.show_all() 


PyApp() 
gtk.main() 

$ winPython --version 
Python 2.7.3 

$ cat /cygdrive/c/Python27/Lib/site-packages/gtk-2.0/pygtk-2.22.0-py2.7.egg-info 
Metadata-Version: 1.1 
Name: pygtk 
Version: 2.22.0 
(abbreviated) 
Platform: MS Windows 
Requires: pycairo (>=1.0.2) 
Requires: pygobject (>=2.21.3) 
Provides: p 
Provides: y 
Provides: g 
Provides: t 
Provides: k 

回答

0

錯誤可能是由於同時安裝了幾個pygtk all-in-one捆綁包。

e.g

pygtk-all-in-one-2.24.2.win32-py2.7.msi 
(and) 
pygtk-all-in-one-2.22.6.win32-py2.7.msi 

要解決該問題,請卸載使用安裝程序或控制面板中的所有版本,只有一個安裝。

0

它是否幫助,如果你存儲菜單項的地方,例如在self,用

self.item_open = gtk.MenuItem('Open') 

更換

item_open = gtk.MenuItem('Open') 

(以及類似的其他菜單項)?

我不知道PyGTK那麼好,但我懷疑它會創建對應於GTK菜單項對象/結構的Python對象。這些Python對象可能在構造函數的末尾被垃圾收集,並且當它們被垃圾收集時,它們可能會刪除底層的GTK C/C++對象。我懷疑菜單項正在消失,因爲它們被刪除。

通過存儲Python對象,可以防止它們被垃圾收集,這應該可以防止相應的C/C++對象被刪除。

然而這是猜測;我沒有測試過你的代碼來驗證這個建議是否有效,所以我可能完全錯誤。

+0

有趣的建議,但結果是相同的,即使指向項目和菜單對象的屬性保留爲'self'。 –