如何用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
相关产品推荐
相关产品推荐

