如何使用Gtk.Builder创建带菜单栏的PyGObject应用?
使用Gtk.Builder在PyGObject中创建菜单栏(替代Gtk.UIManager)
我完全理解你想要用Gtk.Builder替代已弃用的Gtk.UIManager来创建菜单栏的需求,目前这部分的完整文档确实比较零散。下面是一个完整的可运行示例,实现了你需要的功能:一个包含Foo顶级菜单组,且该组下有可点击Bar菜单项的窗口。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gio class App(Gtk.Application): def __init__(self): super().__init__(application_id="org.example.MenuDemo") def do_activate(self): # 创建主窗口 window = Gtk.ApplicationWindow(application=self, title="Menu Demo") window.set_default_size(300, 200) # 使用Gtk.Builder加载菜单UI定义 builder = Gtk.Builder() # 内嵌的Glade格式UI定义,也可以从.glade文件加载 ui_data = """ <interface> <menu id="menubar"> <submenu> <attribute name="label" translatable="yes">_Foo</attribute> <section> <item> <attribute name="label" translatable="yes">_Bar</attribute> <attribute name="action">app.bar</attribute> </item> </section> </submenu> </menu> </interface> """ builder.add_from_string(ui_data) # 创建并注册Gio.Action,处理菜单项点击 def on_bar_action(action, param): print("Bar菜单项被点击了!") # 这里可以添加你的业务逻辑 bar_action = Gio.SimpleAction.new("bar", None) bar_action.connect("activate", on_bar_action) self.add_action(bar_action) # 获取菜单栏并添加到窗口 menubar = builder.get_object("menubar") # 使用HeaderBar承载菜单栏,这是GTK3推荐的现代布局 header_bar = Gtk.HeaderBar(title="Menu Demo", show_close_button=True) header_bar.set_custom_title(menubar) window.set_titlebar(header_bar) # 显示窗口 window.show_all() if __name__ == "__main__": app = App() app.run(None)
关键部分说明:
- Gtk.Builder的UI定义:这里用内嵌的XML字符串定义了菜单栏结构,你也可以把这段XML保存为
.glade文件,然后用builder.add_from_file("your_menu.glade")加载,更便于维护复杂界面。 - Gio.Action绑定:菜单项的点击逻辑通过
Gio.Action实现,这是GTK3及以后版本推荐的标准方式,替代了旧的信号绑定。我们创建SimpleAction并注册到应用中,然后在UI定义里通过action="app.bar"关联菜单项和动作。 - 菜单栏布局:把菜单栏添加到
HeaderBar的自定义标题位置,这是GTK3中常见的现代窗口布局;如果偏好传统样式,也可以直接创建Gtk.MenuBar控件,将其添加到窗口的主容器(比如Gtk.Box)中。
运行这段代码后,你会看到一个窗口,顶部菜单栏的Foo选项展开后包含Bar菜单项,点击Bar会在控制台打印提示信息。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

