2012-06-22 100 views
1

我正在嘗試使用PyGTK編寫的GUI的菜單中實現最近打開的項目列表。我初始化菜單像這樣:在PyGTK中動態修改/刷新菜單內容

self.filemenu = gtk.Menu() 

self.init_file_menu() 

self.fileitem = gtk.MenuItem("File") 
self.fileitem.set_submenu(self.filemenu) 
menubar = gtk.MenuBar() 
menubar.append(self.fileitem) 
outerframe.pack_start(menubar, False, False) 

def init_file_menu(self): 
    for widget in self.filemenu.get_children(): 
     self.filemenu.remove(widget) 

    openitem = gtk.MenuItem("Open") 
    self.filemenu.append(openitem) 
    openitem.connect("activate", self.open_file) 

    self.filemenu.append(gtk.SeparatorMenuItem()) 

    for recentitem in self.settings['recentfiles']: 
     item = gtk.MenuItem(os.path.basename(recentitem)) 
     self.filemenu.append(item) 
     item.connect("activate", self.open_file, recentitem) 
    self.filemenu.show() 

self.settings [「recentitems」]是打開文件時被修改的雙端隊列;然後再次調用init_file_menu。我的目標是清空菜單,然後用正確的順序重新填充正確的項目。此代碼在啓動時填充菜單時工作正常。但由於某些原因,雖然對Menu.remove的調用都可以正常工作並清空菜單,但追加調用不會重新添加項目,並且它仍然爲空。如果我調用它的get_children方法,我發現它們都在內部,但接口沒有更新以反映這一點。如何刷新顯示的菜單並使最近的項目列表按預期工作?

我也接受如何使用RecentChooserMenu小部件的方向,如果這是我正在尋找。

回答

2

由於gtk.Menu是一個容器,你需要.show每個項目將其添加到菜單(因爲你不想打電話給menu.show_all()快捷方式,顯示菜單本身做)後,這樣你就item.show()剛過menu.append(item)

+0

啊,對,這比我想要的更有意義。 self.filemenu.show_all()也似乎工作。 – dpitch40