【发布时间】: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。