How to run a Method on the exit of a kivy app

前端 未结 1 1648
猫巷女王i
猫巷女王i 2021-01-06 06:51

I would like to run a Method when the user tries to exit the app , kind of like a \"are you sure you want to exit\" or \"Do you want to save the file\" type of message whene

1条回答
  •  执笔经年
    2021-01-06 07:20

    If you want your application to simply run things after the GUI has closed, the easiest and smallest approach would be to place any exit code after TestApp().run(). run() creates a endless loop which also clears any event-data from within kivy so it doesn't hang. That endless loop breaks as soon as the window/gui instance dies. So there for, any code after will execute only after the GUI dies too.

    If you want to create a graceful shutdown of the GUI with for instance socket-closing events or a popup asking the user if that's what they really want to do, then creating a hook for the on_request_close event is the way to go:

    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()
    

    Courtesy of pythonic64 who created a gist on the topic in a issue way back when.

    0 讨论(0)
提交回复
热议问题