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

如何用Gtk.Application、Gtk+3、Glade、Python切换窗口及实现相关管理?

我刚好熟悉你用的Python 2.7 + PyGObject 3.24.1环境,给你整理了一套可直接运行的完整示例,覆盖启动/关闭、窗口管理和菜单管理三大功能,每个部分都有详细注释:

完整实现代码
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio

class MyApplication(Gtk.Application):
    def __init__(self):
        # 初始化应用,设置application ID(必须符合反向域名格式)
        Gtk.Application.__init__(self, application_id="org.example.MyApp",
                                 flags=Gio.ApplicationFlags.FLAGS_NONE)
        
        # 保存窗口引用,用于窗口管理
        self.main_window = None

    def do_startup(self):
        # 启动阶段:创建应用菜单
        Gtk.Application.do_startup(self)
        
        # 创建"文件"菜单
        file_menu = Gio.Menu()
        # 添加"新建窗口"菜单项,绑定到on_new_window方法
        file_menu.append("新建窗口", "app.new_window")
        # 添加"退出"菜单项,绑定到app.quit动作(Gtk.Application内置动作)
        file_menu.append("退出", "app.quit")
        
        # 创建"帮助"菜单
        help_menu = Gio.Menu()
        help_menu.append("关于", "app.about")
        
        # 创建主菜单结构
        app_menu = Gio.Menu()
        app_menu.append_section(None, file_menu)
        app_menu.append_section(None, help_menu)
        
        # 设置应用菜单
        self.set_app_menu(app_menu)
        
        # 注册自定义动作:新建窗口
        new_action = Gio.SimpleAction.new("new_window", None)
        new_action.connect("activate", self.on_new_window)
        self.add_action(new_action)
        
        # 注册自定义动作:关于窗口
        about_action = Gio.SimpleAction.new("about", None)
        about_action.connect("activate", self.on_about)
        self.add_action(about_action)
        
        # 给"退出"动作设置快捷键Ctrl+Q
        self.set_accels_for_action("app.quit", ["<Ctrl>Q"])

    def do_activate(self):
        # 激活应用时触发:如果主窗口不存在则创建
        if not self.main_window:
            self.main_window = Gtk.ApplicationWindow(application=self, title="主窗口")
            self.main_window.set_default_size(400, 300)
            
            # 添加一个按钮,点击打开新窗口
            btn = Gtk.Button(label="打开新窗口")
            btn.connect("clicked", self.on_new_window)
            self.main_window.add(btn)
            
            self.main_window.show_all()
        
        # 把主窗口提到最前面
        self.main_window.present()

    def on_new_window(self, action=None, param=None):
        # 创建新窗口(窗口管理:多窗口示例)
        new_win = Gtk.ApplicationWindow(application=self, title="新窗口")
        new_win.set_default_size(300, 200)
        new_win.show_all()
        # 新窗口关闭时不需要退出整个应用,Gtk.Application会自动管理窗口生命周期

    def on_about(self, action, param):
        # 关于窗口示例
        about_dialog = Gtk.AboutDialog(transient_for=self.main_window)
        about_dialog.set_program_name("My Gtk App")
        about_dialog.set_version("1.0")
        about_dialog.set_authors(["Rohit S"])
        about_dialog.run()
        about_dialog.destroy()

    def do_shutdown(self):
        # 应用关闭前的清理操作(可选)
        print("应用正在关闭...")
        Gtk.Application.do_shutdown(self)

if __name__ == "__main__":
    app = MyApplication()
    # 启动应用,处理命令行参数(Gtk.Application内置支持)
    exit_status = app.run(None)
    print("应用退出状态:", exit_status)

关键功能解释

1. 启动与关闭

  • 启动:通过app.run(None)启动应用,Gtk.Application会自动处理D-Bus激活、多实例(默认同一应用ID只会运行一个实例,新启动请求会激活已有实例)。
  • 关闭:
    • 内置app.quit动作可以直接退出整个应用,我们给它绑定了Ctrl+Q快捷键。
    • 主窗口关闭时,默认会触发应用退出(因为窗口是Gtk.ApplicationWindow,关联了应用);如果是普通窗口,关闭不会影响应用运行。
    • 可以通过do_shutdown方法添加关闭前的清理逻辑。

2. 窗口管理

  • 单窗口管理:在do_activate方法中检查主窗口是否存在,避免重复创建,确保每次激活应用都显示同一个主窗口。
  • 多窗口管理:通过on_new_window方法创建新的Gtk.ApplicationWindow,Gtk.Application会自动跟踪所有窗口,当最后一个窗口关闭时,应用会自动退出(可以通过设置Gio.ApplicationFlags.HANDLES_OPEN等修改这个行为)。
  • 用present()方法将窗口提到最前面,确保用户能看到。

3. 菜单管理

  • 应用菜单:在do_startup方法中创建菜单结构,用Gio.Menu组织菜单项,绑定到动作(内置动作或自定义动作)。
  • 动作系统:通过Gio.SimpleAction注册自定义动作,比如"新建窗口"和"关于",然后连接到对应的处理方法。
  • 快捷键绑定:用set_accels_for_action给动作设置快捷键,比如Ctrl+Q对应退出。

注意事项

  • 你的Python 2.7环境要确保PyGObject 3.24.1正确安装,代码里的gi.require_version('Gtk', '3.0')必须保留,指定使用GTK3。
  • Application ID必须符合反向域名格式(比如org.example.MyApp),否则D-Bus激活可能出问题。
  • 如果需要处理命令行参数或文件打开,可以重写do_open方法,这也是Gtk.Application内置支持的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:36:28