You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:43:26