Python中如何让Gtk.Application在无窗口状态下保持运行
GTK3 应用关闭所有窗口后后台保活实现方案
核心原理
Gtk.Application 默认将生命周期与窗口绑定,最后一个关联窗口被销毁时会自动终止进程。你可以通过持有应用实例、拦截窗口关闭信号实现后台保活,修改步骤如下:
步骤1:补充导入Gio模块
应用保活需要用到Gio模块下的应用控制方法,先补充导入:
from gi.repository import Gtk, Gio
步骤2:持有应用实例阻止自动退出
在应用启动时调用hold()方法增加应用的引用计数,只要引用计数不为0,应用就不会因为无窗口而自动退出:
def do_startup(self): """Start the app.""" Gtk.Application.do_startup(self) # 持有应用实例,阻止无窗口时自动退出 self.hold()
步骤3:拦截窗口关闭信号,关闭时仅隐藏不销毁
拦截主窗口的delete-event信号,把默认的销毁窗口行为改成隐藏,后续需要显示窗口时直接调用present()即可,不需要重建窗口:
class AppWindow(Gtk.ApplicationWindow): """The main window for the application.""" def __init__(self, *args, application, **kwargs): Gtk.ApplicationWindow.__init__( self, *args, application=application, **kwargs ) self.app = application # 绑定窗口关闭信号 self.connect("delete-event", self.on_close_window) self.show_all() def on_close_window(self, widget, event): # 隐藏窗口 self.hide() # 返回True表示事件已处理,阻止默认的销毁窗口、退出应用逻辑 return True
完整修改后代码
import gi import sys gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gio class App(Gtk.Application): """The application manager.""" def __init__(self, *args, **kwargs): Gtk.Application.__init__( self, *args, application_id="org.app_test", **kwargs ) self.window = None def do_activate(self): """Activate the app.""" if self.window is None: self.window = AppWindow(application=self, title="MusicApp", name="0") # 窗口已存在的话直接显示 self.window.present() def do_startup(self): """Start the app.""" Gtk.Application.do_startup(self) # 持有应用实例,阻止无窗口时自动退出 self.hold() class AppWindow(Gtk.ApplicationWindow): """The main window for the application.""" def __init__(self, *args, application, **kwargs): Gtk.ApplicationWindow.__init__( self, *args, application=application, **kwargs ) self.app = application # 绑定窗口关闭信号 self.connect("delete-event", self.on_close_window) self.show_all() def on_close_window(self, widget, event): self.hide() # 返回True表示事件已处理,阻止默认销毁逻辑 return True if __name__ == "__main__": app = App() app.run(sys.argv)
补充说明
如果需要完全退出应用,在需要触发退出的逻辑(比如托盘菜单的退出按钮)中调用app.quit()即可主动终止进程。
内容的提问来源于stack exchange,提问作者Sylvester is on codidact.com
相关产品推荐
相关产品推荐

