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

如何使用PyGI在GTK 4中创建应用菜单?

Gtk4 菜单实现示例(中文适配版)

我已在谷歌上大量搜索相关内容,并尝试过多个示例。现将最接近需求的修正后示例(修复了原代码中的语法错误)展示如下:

import gi

gi.require_version("Gtk", "4.0")
from gi.repository import Gtk, Gio


class ExampleApp(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.window = None

    def do_activate(self):
        if not self.window:
            # 创建主窗口
            self.window = Gtk.ApplicationWindow(application=self, title="GMenu示例")
            # 生成菜单栏
            menu_bar = self.create_menu()
            # 将菜单栏绑定到窗口
            self.window.set_menu_bar(menu_bar)
            # 显示窗口
            self.window.present()

    def create_menu(self):
        # 初始化主菜单栏
        menu_bar = Gio.Menu()
        
        # 构建文件子菜单
        file_menu = Gio.Menu()
        file_menu.append("新建", "app.new")
        file_menu.append("退出", "app.quit")
        
        # 构建编辑子菜单
        edit_menu = Gio.Menu()
        edit_menu.append("复制", "app.copy")
        edit_menu.append("粘贴", "app.paste")
        
        # 将子菜单添加到主菜单栏
        menu_bar.append_submenu("文件", file_menu)
        menu_bar.append_submenu("编辑", edit_menu)

        # 为菜单项创建动作并绑定触发逻辑
        # 新建动作
        new_action = Gio.SimpleAction.new("new", None)
        new_action.connect("activate", self.on_new_triggered)
        self.add_action(new_action)
        
        # 退出动作
        quit_action = Gio.SimpleAction.new("quit", None)
        quit_action.connect("activate", self.on_quit_triggered)
        self.add_action(quit_action)
        
        # 复制动作(修复原代码中的语法错误)
        copy_action = Gio.SimpleAction.new("copy", None)
        copy_action.connect("activate", self.on_copy_triggered)
        self.add_action(copy_action)
        
        # 粘贴动作
        paste_action = Gio.SimpleAction.new("paste", None)
        paste_action.connect("activate", self.on_paste_triggered)
        self.add_action(paste_action)

        return menu_bar

    def on_new_triggered(self, action, param):
        print("新建动作已触发")

    def on_quit_triggered(self, action, param):
        self.quit()

    def on_copy_triggered(self, action, param):
        print("复制动作已触发")

    def on_paste_triggered(self, action, param):
        print("粘贴动作已触发")


if __name__ == "__main__":
    app = ExampleApp(application_id="com.example.GMenuExample")
    app.run(None)

核心逻辑说明

  • 基于Gtk.Application搭建应用框架,do_activate方法完成窗口初始化与显示
  • 使用Gio.Menu构建层级菜单,通过append_submenu挂载子菜单
  • 每个菜单项对应Gio.SimpleAction,绑定回调函数实现点击响应
  • 调用set_menu_bar将菜单栏绑定到主窗口,完成菜单功能集成

内容的提问来源于stack exchange,提问作者dstromberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:52:08