Umschalten auf SecondScreen nach Permissions

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Hi
Ich brauche eure Mithilfe nochmal.
Ich versteh nicht, wo der Fehler in meinem Code ist.
Ich frage im FirstScreen die Berechtigungen ab, die ich später für die App benötige.
Wenn die Berechtigungen durch den User (Handy Click) erteilt werden, soll direkt auf den SecondScreen umgeschaltet werden und wenn
nicht, soll ein Popup mit einer Fehlermedung (nicht alle Berechtigungen wurden vom User erteilt) ausgegeben werden.
Das Umschalten funktioniert aber nicht und auch das Aufrufen des Popups nicht (obwohl ich per Button das Popup fehlerfrei ansprechen kann).
Eine Fehlerausgabe erhalte ich nicht, leider. Es passiert aber auch nichts weiter danach.

Code: Alles auswählen

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.properties import StringProperty
from kivy.core.window import Window
from kivy.utils import platform


class PopupErrors(Popup):
    error_text = StringProperty()

    def __init__(self, title, text, **kwargs):
        super(PopupErrors, self).__init__(**kwargs)
        self.title = title
        self.error_text = text
        self.size_hint = (None, None)
        self.size = (Window.width * 0.8, Window.height * 0.6)


class FirstScreen(Screen):
    def __init__(self, **kwargs):
        super(FirstScreen, self).__init__(**kwargs)

        if platform == "android":
            from android.permissions import request_permissions, Permission

            def callback(_, results):
                if all([res for res in results]):
                    self.ids.lbl_status.text = f"Callback: All permissions granted."
                    self.manager.current = "first_screen"

                else:
                    self.ids.lbl_status.text = f"Callback: Some permissions refused."
                    text = f"(2) This is the content\nof the custom popup"
                    PopupErrors(title=screen.name, text=text).open()

            request_permissions(
                [
                    Permission.ACCESS_COARSE_LOCATION,
                    Permission.ACCESS_FINE_LOCATION,
                    Permission.WRITE_EXTERNAL_STORAGE,
                    Permission.READ_EXTERNAL_STORAGE,
                ],
                callback,
            )


class SecondScreen(Screen):
    def __init__(self, **kwargs):
        super(SecondScreen, self).__init__(**kwargs)

    def change_label_text(self):
        self.ids.my_label.text = "Neuer Text!"

    def switch_to_screen(self):
        self.manager.transition.direction = "right"
        self.manager.current = "first_screen"

    def on_leave(self):
        self.ids.my_label.text = "This is the Second Screen"

    @staticmethod
    def show_popup(screen):
        text = f"(2) This is the content\nof the custom popup"
        PopupErrors(title=screen.name, text=text).open()


class ScreenManagerApp(App):
    def build(self):
        Builder.load_file("layout.kv")

        screen_manager = ScreenManager()
        screen_manager.transition = FadeTransition()
        screen_manager.add_widget(FirstScreen(name="first_screen"))
        screen_manager.add_widget(SecondScreen(name="second_screen"))
        return screen_manager


if __name__ == "__main__":
    ScreenManagerApp().run()

Code: Alles auswählen

<PopupErrors>:
    BoxLayout:
        orientation: 'vertical'

        Label:
            text: root.error_text
            font_size: '14sp'
            pos_hint: {"x": dp(0), "top": dp(1)}

        Button:
            text: "Schließen"
            font_size: '16sp'
            size_hint_y: None
            height: self.texture_size[1] + dp(40)
            pos_hint: {"x": dp(0), "y": dp(.1)}
            on_press: root.dismiss()


<FirstScreen>:
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: lbl_status


<SecondScreen>:
    BoxLayout:
        orientation: 'vertical'

        Label:
            id: my_label
            text: 'This is the Second Screen'

        Button:
            text: 'Change label text'
            on_press: root.change_label_text()

        Button:
            text: 'Show Popup'
            on_press: root.show_popup(root)

        Button:
            text: "To FirstScreen"
            font_size: '25sp'
            on_release: root.switch_to_screen()
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Wieso importierst du denn jetzt plötzlich mitten im Code und wieso definierst du `callback` in der `__init__`?
`screen` ist nicht definiert.

Übrigens die `f`-Strings sind unnötig und könnten "normale" Strings sein. Anstelle der list-comprehension kannst du auch `list(result)` schreiben.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13118
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nicht nur die „list comprehension“ ist unnötig, überhaupt dort eine Liste erstellen ist es. ``all(results)`` reicht aus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten