Python3. Kivy. ScreenManager

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • main.py

    main.kv

    Hallo,
    ich möchte in meinem Projekt Python3, Kivy und den ScreenManager benutzen. Allerdings stoße ich auf kleinere Probleme.
    was der code bisher kann:
    -zwischen 2 Screens wechseln
    -ein button mit Touchinput erhöhen
    -bei einmaligen touchinput wird sich immer die aktuelle Uhrzeit geholt.

    ich treffe allerdings auf Probleme, wenn ich eine allgemeine while Schleife oder ähnliches bauen möchte, da ich nicht weiß wo ich sie rein tun sollen? in ScreenManager? würde ganz gerne die Uhr und zukünftig auch andere Events immer aktuell halten (Clock.schedule_interval) ohne ein benötigten Touchinput. Aktuell liegt das Problem darin, dass ich nur mit Touchinput auf die Funktion updateZeit zugreifen kann...
    Kann mir wer helfen ? :)
    Danke schonmal vorweg

    Einmal editiert, zuletzt von Danjin (2. März 2017 um 11:08)

  • Eine eigene while brauchst du nicht da Kivy ähnlich wie Tkinter intern bereits eine while Schleife hat und darüber solche Sachen wie Clock.schedule_interval() oder StringProperty() ständig zu aktualisieren/auszuführen.

    Ich hab dir ja schon im Wie sage ich es in Python ? (Einsteigerfragen) Thread versucht zu erklären wie du deine Klassen/Funktionen besser aufbauen solltest wie zB die MainScreen, die kann man mit weitaus weniger Zeilen schreiben.
    MainApp().build() brauchst du ebenfalls nicht selbst aufrufen, das wird von Kivy automatisch gemach.
    Hier könnte es nämlich auch sein das Du dir einen Fehler eingebaut hast weil 2x ein MainApp() Objekt erzeugt wird, weil du das 2x so ausführst:
    MainApp().build()
    MainApp().run()
    Also wenn dann erzeugt man ein mal das Objekt und hinterlegt es in eine Variable: app = MainApp()
    Und kann dann auf die Funktionen/Methoden der Klasse zugreifen:
    app.build()
    app.run()
    Aber das ist wie gesagt eigentlich unnötig, es würde reichen:
    [code=php]
    if __name__ == "__main__":
    MainApp().run()
    [/php]
    Alternativ:
    [code=php]
    if __name__ == "__main__":
    app = MainApp()
    app.run()
    [/php]

    Allerdings sehe ich in der MainApp auch noch ein paar Unstimmigkeiten bzw weiß MainApp nichts von MainScreen und warum du presentation ausserhalb einer Klasse definierst ist auch seltsam :denker:

    Was soll AnotherScreen bewirken?


  • Ich hab dir ja schon im Wie sage ich es in Python ? (Einsteigerfragen) Thread versucht zu erklären wie du deine Klassen/Funktionen besser aufbauen solltest wie zB die MainScreen, die kann man mit weitaus weniger Zeilen schreiben.


    damit kommt ein error...

    Code
    Traceback (most recent call last):
       File "main.py", line 39, in <module>
         presentation = Builder.load_file("main.kv")
       File "/usr/local/lib/python3.4/dist-packages/kivy/lang/builder.py", line 301, in load_file
         return self.load_string(data, **kwargs)
       File "/usr/local/lib/python3.4/dist-packages/kivy/lang/builder.py", line 380, in load_string
         self._apply_rule(widget, parser.root, parser.root)
       File "/usr/local/lib/python3.4/dist-packages/kivy/lang/builder.py", line 562, in _apply_rule
         child = cls(__no_builder=True)
     TypeError: __init__() got an unexpected keyword argument '__no_builder'



    MainApp().build() brauchst du ebenfalls nicht selbst aufrufen, das wird von Kivy automatisch gemach.
    Hier könnte es nämlich auch sein das Du dir einen Fehler eingebaut hast weil 2x ein MainApp() Objekt erzeugt wird, weil du das 2x so ausführst:


    rausgenommen


    Allerdings sehe ich in der MainApp auch noch ein paar Unstimmigkeiten bzw weiß MainApp nichts von MainScreen und warum du presentation ausserhalb einer Klasse definierst ist auch seltsam :denker:


    naja Mainapp öffnet ja die kv file wo dann oben der ScreenManager ist und dann die beiden Screens.
    wie würdest du es realisieren?


    Was soll AnotherScreen bewirken?


    aktuell noch nicht viel. Man kann dort ein Button hochzählen(mit touchinput) und beim wechseln zum mainscreen resette er sich auf 0.
    Habe diesen Screen eingebaut, da ich zukünftig einen zweiten Screen brauche zwischen den ich dann switchen kann und es in einem Beispielvideo zum Screenmanager so gemacht wurde ^^.

    Einmal editiert, zuletzt von Danjin (1. März 2017 um 16:25)

  • hab den code ganz oben mal aktualisiert.
    läuft soweit wie gewünscht. Würdet ihr noch etwas eleganter lösen ?

    besonders weil im Hintergrund mir beim laden dies angezeigt wird:

    Code
    [WARNING] [Lang        ] The file /usr/local/TVvM/Test2/main.kv is loaded multiples times, you might have unwanted behaviors.

    wenn ich zwischen den Screens hin und her switche:

    Code
    [WARNING] [Multiple screens named "other"] [<Screen name='other'>, <Screen name='other'>]
    
    
    [WARNING] [Multiple screens named "main"] [<Screen name='main'>, <Screen name='main'>]

    Einmal editiert, zuletzt von Danjin (2. März 2017 um 10:59)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!