在PyGTK中动态修改/刷新菜单内容

时间:2012-06-22 15:03:11

标签: python gtk pygtk

我正在尝试在我用PyGTK编写的GUI菜单中实现最近打开的项目列表。我像这样初始化菜单:

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小部件的指示。

1 个答案:

答案 0 :(得分:5)

由于gtk.Menu是一个容器,因此在将其添加到菜单后需要.show每个项目(因为您不想调用显示菜单本身的menu.show_all()快捷方式),所以你在item.show()

之后立即menu.append(item)