如何在 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 应用程序退出时运行方法的主要内容,如果未能解决你的问题,请参考以下文章
在 ubuntu linux 中调试 kivy 应用程序时出现问题,当我尝试调试应用程序时,它开始导入要求,然后显示错误并退出
如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍然运行)?