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

标签 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 方法,我会看到它们都在内部,但界面尚未更新以反射(reflect)这一点。如何刷新显示的菜单并使最近的项目列表按预期工作?

我也会接受有关如何使用 RecentChooserMenu 的指导小部件,如果这是我正在寻找的。

最佳答案

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

之后执行 item.show()

关于python - 在 PyGTK 中动态修改/刷新菜单内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158860/

相关文章:

python - GAE 是否支持 django 管理表单

python - 无法找到 GTK gi 包 OS X

python - 如何使用 PyGObject 将弹出菜单附加到 GTK2 中的列标题按钮?

Python计算每个IP每小时的请求率

python - 我的 python 子进程是否破坏了什么?

python - 打印 snmpwalk 结果的数量

python - 更改 Gtk.Button 标签的样式/字体

c - GTK 使用 Glade 将用户数据传递给回调

python - pygtk 中的多行 gtk 条目

python - 当是布局子项时启用 PyGTK Eventbox 运动通知事件