如何在 kivy 应用程序退出时运行方法

Posted

技术标签:

【中文标题】如何在 kivy 应用程序退出时运行方法【英文标题】:How to run a Method on the exit of a kivy app 【发布时间】:2019-06-27 07:20:13 【问题描述】:

我想在用户尝试退出应用程序时运行一个方法,有点像“你确定要退出”或“你想保存文件”类型的消息,只要用户尝试退出点击窗口顶部的退出按钮退出

类似的东西 on_quit: app.root.saveSession()

【问题讨论】:

TestApp().run() 本质上是一个让您的应用程序保持活力的无限循环。只要您的应用程序的图形部分关闭/退出,TestApp().run() 之后的任何内容都会被执行。尝试在它后面加上print("moo"),看看会发生什么。 谢谢,它可以工作,但我不希望在用户单击退出按钮时立即关闭窗口。我希望它首先显示类似“您确定要退出”或“您要保存此会话”之类的弹出窗口。 然后为on_request_close 创建一个钩子,它会接收关闭事件并执行您想要的正常关闭。 嘿,不客气。这个 sn-p 实际上不是我的,它基于我不久前追踪的 issue。我只是碰巧知道 kivy/pyglet/pygame 是如何工作的。尤其是他们的主循环和注册的钩子。很高兴它有效! :) 【参考方案1】:

如果您希望您的应用程序在 GUI 关闭后简单地运行,最简单和最小的方法是在 TestApp().run() 之后放置任何退出代码。 run() 创建一个无限循环,它还会清除 kivy 中的任何事件数据,因此它不会挂起。一旦窗口/ gui 实例死亡,那个无限循环就会中断。因此,之后的任何代码都只会在 GUI 死掉之后才会执行。

如果您想创建一个优雅的 GUI 关闭,例如套接字关闭事件或弹出窗口询问用户是否真的想要这样做,那么为 on_request_close 事件创建一个钩子是要走的路:

from kivy.config import Config
Config.set('kivy', 'exit_on_escape', '0')

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.core.window import Window


class ChildApp(App):

    def build(self):
        Window.bind(on_request_close=self.on_request_close)
        return Label(text='Child')

    def on_request_close(self, *args):
        self.textpopup(title='Exit', text='Are you sure?')
        return True

    def textpopup(self, title='', text=''):
        """Open the pop-up with the name.

        :param title: title of the pop-up to open
        :type title: str
        :param text: main text of the pop-up to open
        :type text: str
        :rtype: None
        """
        box = BoxLayout(orientation='vertical')
        box.add_widget(Label(text=text))
        mybutton = Button(text='OK', size_hint=(1, 0.25))
        box.add_widget(mybutton)
        popup = Popup(title=title, content=box, size_hint=(None, None), size=(600, 300))
        mybutton.bind(on_release=self.stop)
        popup.open()


if __name__ == '__main__':
    ChildApp().run()

感谢pythonic64,他早在issue 就该主题创建了gist。

【讨论】:

以上是关于如何在 kivy 应用程序退出时运行方法的主要内容,如果未能解决你的问题,请参考以下文章

按“退出”时离开 kivy 应用程序

在 KIVY 中运行程序时如何更改窗口上的图标

在 ubuntu linux 中调试 kivy 应用程序时出现问题,当我尝试调试应用程序时,它开始导入要求,然后显示错误并退出

如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍然运行)?

在 iOS 设备上运行时,如何允许我的 Kivy 应用程序访问文本文件?

Kivy--Plyer--Android--在应用未运行时发送通知