Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

python

kivy

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 whenever the user tries to exit by clicking the Exit button on top of the window

Some thing like on_quit: app.root.saveSession()

like image 858
heyt0pe Avatar asked Feb 03 '19 08:02

heyt0pe


People also ask

How do I exit Kivy?

Try using App. get_running_app(). stop() . For more details, read the Kivy documentation article for the function.

How do I run a program on Kivy?

Create an application¶ Creating a kivy application is as simple as: sub-classing the App class. implementing its build() method so it returns a Widget instance (the root of your widget tree) instantiating this class, and calling its run() method.

Is Kivy good for making apps?

Why Use Kivy for Python Mobile App Development? Kivy is a cross-platform Python framework created to assist in rapid Python application development. It supports various user interfaces, including multi-touch screens, and various platforms, including iOS, Android, and Windows.

Is Kivy frontend or backend?

Kivy is a Python-based library and can be used to develop the Frontend for your app. Kivy can be used as a Frontend library and for the backend, one can use Python.


1 Answers

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.

like image 123
Torxed Avatar answered Oct 20 '22 05:10

Torxed