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

PyGObject开发中如何一次性关闭所有窗口并退出Gtk主循环

问题原因

Gtk.main_quit()的作用仅为终止GTK的主事件循环,并不会主动触发窗口的销毁逻辑。事件循环停止后,窗口无法响应系统的重绘、关闭等调度指令,因此会以无响应的状态停留在屏幕上,直到进程完全退出后由操作系统回收相关资源。

一次性关闭所有窗口的实现方法

GTK提供了Gtk.Window.list_toplevels()方法,可以直接获取当前应用所有已创建的顶层窗口实例,遍历调用destroy()方法即可批量销毁所有窗口,之后再退出主循环即可解决窗口僵死的问题。
修改后的示例代码如下:

from gi.repository import Gtk

def quit_app(*args):
    # 批量销毁所有顶层窗口
    for window in Gtk.Window.list_toplevels():
        window.destroy()
    # 销毁完成后退出主循环
    Gtk.main_quit()

win = Gtk.Window(title="窗口1")
win.connect('button-press-event', quit_app)
win.show()

# 可新增多个窗口测试批量关闭效果
win2 = Gtk.Window(title="窗口2")
win2.show()

Gtk.main()

input('press Enter to end:')

运行上述代码点击任意窗口,所有窗口会立即关闭,同时主循环退出,后续的input语句正常执行。

退出前不销毁窗口的合规性说明

分两种场景判断:

  • 如果退出主循环后程序会立即终止:不符合GTK的开发规范,但不会产生严重的副作用,进程退出后操作系统会自动回收所有关联的窗口资源、内存资源。
  • 如果退出主循环后还需要执行长时间的后续逻辑(比如数据导出、批量计算等):属于不合规操作,会存在以下问题:
    • 无响应的僵死窗口会一直显示在用户桌面,无法操作也无法关闭,使用体验极差
    • 未销毁的GTK资源会持续占用内存,造成不必要的内存占用
    • 部分绑定系统级资源的GTK组件可能会产生资源残留,影响其他应用或本应用的下次启动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:18:01