Kivy - Klassen mit Screens verknüpfen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
ElastischerHosenbund
User
Beiträge: 12
Registriert: Donnerstag 22. Juli 2021, 22:52

Samstag 25. September 2021, 20:55

Hallo zusammen,

ich habe vor kurzem angefangen mich in Kivy einzuarbeiten und stecke nun fest...
Ich möchte mit mehreren Screens arbeiten. Klickt man im Programm auf einen Button, soll sich ein anderer Screen öffnen usw.
Am liebsten wäre es mir noch (der Übersichtlichkeit wegen) wenn man für jeden Screen eine eigene .kv-File hätte, aber das ist fürs erste nebensächlich.

Meine Frage nun: Wie verknüpfe ich die unterschiedlichen Screens mit unterschiedlichen Klassen?
Meine Python-File:

Code: Alles auswählen

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

class FirstWindow(Screen):
    def printing(self):
        print("Ich bin der erste Screen!")

class SecondWindow(Screen):
    def printing(self):
        print("Ich bin der zweite Screen!")

class WindowManager(ScreenManager):
    pass



class MyApp(App):
    def build(self):
        return Builder.load_file("test.kv")


if __name__ == "__main__":
    MyApp().run() 
Kivy-File:

Code: Alles auswählen

WindowManager:
    FirstWindow:
    SecondWindow:

<FirstWindow>:
    name: "first"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "First Screen"
            font_size: 32

        Button:
            text: "Next Screen"
            font_size: 32
            on_release:
                app.root.current = "second"
                root.manager.transition.direction = "left"
            #on_press: app.printing()

<SecondWindow>:
    name: "second"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "Second Screen"
            font_size: 32

        Button:
            text: "Go Back"
            font_size: 32
            on_release:
                app.root.current = "first"
                root.manager.transition.direction = "right"
            #on_press: app.printing()


Versuche ich die beiden auskommentierten printing-Methoden auszuführen, erhalte ich
folgenden Fehler: AttributeError: 'MyApp' object has no attribute 'printing'
Logisch nehme ich mal an.. Wie verknüpf ich nun also die Screens zu ihren eigentlichen Klassen?

Habe schon allerlei Youtube-Tuts und Google-Beiträge durchgesucht...
Hoffe mir kann jemand weiterhelfen :)
ElastischerHosenbund
User
Beiträge: 12
Registriert: Donnerstag 22. Juli 2021, 22:52

Samstag 25. September 2021, 22:30

Okay.. Glaube das mit dem Klassenzugriff hab ich nun raus... Zumindest scheint es für den Moment zu funktionieren. Werde ich morgen nochmal genauer testen. Bleibt noch die Frage, ob man für jeden Screen auch eine eigene .kv File schreiben kann?

Ansonsten hier nun der funktionierende Code:
Python:

Code: Alles auswählen

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

# Define our different screens


class FirstWindow(Screen):

    def printing(self):
        print("Ich bin der erste Screen")

class SecondWindow(Screen):
    def printing(self):
        print("Ich bin der zweite Screen")

class WindowManager(ScreenManager):
    pass



class MyApp(MDApp):
    def build(self):
        return Builder.load_file("test.kv")


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

Code: Alles auswählen

WindowManager:
   
    FirstWindow:
        id: firstWindow
    SecondWindow:
        id: secondWindow

<FirstWindow>:
    name: "first"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "First Screen"
            font_size: 32

        Button:
            text: "Next Screen"
            font_size: 32
            on_release:
                app.root.current = "second"
                root.manager.transition.direction = "left"
            on_press: root.manager.ids.firstWindow.printing()

<SecondWindow>:
    name: "second"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "Second Screen"
            font_size: 32

        Button:
            text: "Go Back"
            font_size: 32
            on_release:
                app.root.current = "first"
                root.manager.transition.direction = "right"
            on_press: root.manager.ids.secondWindow.printing()




Antworten