【问题标题】:Is it possible to edit menu items in runtime in Python using gtk?是否可以使用 gtk 在 Python 运行时编辑菜单项?
【发布时间】:2018-12-13 18:37:05
【问题描述】:

我正在用 python 编写简单的应用程序,我想使用 PyGtk 编写一个菜单。问题是,在“连接”菜单项下,我想要一个可用设备列表,这些设备在程序运行期间会发生变化。到目前为止,我创建菜单项的代码如下:

import gtk
import gobject

class Foo(object):
    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        gobject.timeout_add(2000, self.AddNewDevice_TEST)   

        table = gtk.Table(2,1,False)
        window.add(table)

        menubar = gtk.MenuBar()

        self.connectMenu = gtk.Menu()
        connectItem = gtk.MenuItem("Connect")
        connectItem.set_submenu(self.connectMenu)

        dev1 = gtk.MenuItem("device1")
        dev1.connect("activate", self.connectToDev)
        self.connectMenu.append(dev1)

        menubar.append(connectItem)

        table.attach(menubar, 0,1,0,1)

        window.show_all()   

    def connectToDev(self, device):
        pass

    def AddNewDevice_TEST(self):
        dev = gtk.MenuItem("device")
        dev.connect("activate", self.connectToDev)
        self.connectMenu.append(dev)


if __name__=='__main__':
    gui = Foo()
    gtk.main()

问题是当新设备出现在我的系统中或断开连接时,我想从“连接”下的列表中添加或删除它。 我可以在菜单中编辑设备列表,但在调用 gtk.main() 后我无法再进行更改。有没有办法在运行时做到这一点?

【问题讨论】:

  • 仅供参考,pygtk 使用过时的 Gtk 版本 2。当前版本是 Gtk3,您使用 from gi.repository import Gtk 导入。
  • 您可以在运行时修改菜单,方式与此处完全相同。如果它不起作用,那么你做错了什么。请张贴minimal reproducible example 说明问题。
  • 我编辑了代码,这就是我所拥有的。由于我的应用程序的其他部分,我需要表格
  • 嗯,现在好像可以了。我不知道我做错了什么。
  • 如果您的程序是多线程的,请确保不要从线程修改 GUI。你可以使用idle_add让主循环执行一个函数;有关 gtk 中的多线程的更多信息,请参阅 here

标签: python pygtk


【解决方案1】:

您可以在运行时在不同的线程中更改菜单项,例如GObject.idle_add(self.connectMenu.remove, dev1)GObject.idle_add(self.connectMenu.append, dev1)GNOME Developer Documentation 中提到的 GtkMenuShell 方法可能会有所帮助。

不要忘记在 question 的答案中提到的 MenuItems 上调用 show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多