(Kivy) Inhalte in neuen Screen laden

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
H3llo
User
Beiträge: 20
Registriert: Montag 9. Mai 2022, 10:17

Hallo, ich habe ein paar Anfängerfragen zu Kivy. Im Netz habe ich leider nichts gefunden. Also, Folgendes: Ich habe eine
Startseite. Wird auf dieser auf den Button "Highscores" geklickt, möchte ich, dass sich ein neuer Screen öffnet und die
gespeicherten Highscores untereinander ausgegeben werden. Der Code sieht wie folgt aus:

Für die Startseite und die Highscores-Seite in der PY-Datei:

Code: Alles auswählen

class Startseite(Screen):
    pass

class Highscores(Screen):
    pass

class WindowManager(ScreenManager):
    pass
Für die Startseite und den Button in der KV-Datei:

Code: Alles auswählen

<Startseite>:
    name: "startseite"
	Button:
        	text: "Highscores"
                on_press:
                    app.root.current = "highscores"
Für die Highscores-Seite in der KV-Datei:

Code: Alles auswählen

<Highscores>:
    name: "highscores"
    BoxLayout:
        orientation: "vertical"
        Label:
            text: "Highscores"
        Label:
        Label:
        Label:
        Label:
        Label:
        Label:
        Label:
        Label:
        Label:
        Label:
Die Highscores lade ich aus einer Textdatei in eine Liste. Der Code dafür sieht wie folgt aus:

Code: Alles auswählen

    highscoreString = str(open("textfiles/highscores.txt", "r"))
    highscores = []
    while highscoreString.count(",") > 0:
        highscores.append(highscoreString[:highscoreString.find(",") - 2])
        highscoreString = highscoreString[highscoreString.find(","):]
Wo aber setze ich diesen Code hin und wie schaffe ich es, die Highscores als Labeltext zu setzen?
Benutzeravatar
__blackjack__
User
Beiträge: 13063
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@H3llo: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Das lesen der Highscore-Datei wird so nicht funktionieren, weil das nichts gelesen wird. Du wandelst das Dateiobjekt in eine Zeichenkettendarstellung um, was aber keinen Sinn macht.

Dateien die man öffnet, sollte man auch wieder schliessen. Wo das möglich ist, sollte man beim öffnen die ``with``-Anweisung verwenden. Wenn man allerdings die gesamte Datei auf einmal lesen will, bietet `pathlib.Path` eine Methode die öffnen, einlesen, und schliessen in einem Aufruf erledigt. In jedem Fall sollte man bei Textdateien immer explizit die Kodierung angeben.

Das Aufteilen der Zeichenkette an Kommas ist extrem umständlich und ineffizient geschrieben. Es gibt die `split()`-Methode auf Zeichenketten.

Falls die Highscores von dem Programm auch geschrieben werden sollte der Dateiname/Pfad der Datei nicht mehrfach im Quelltext stehen, sondern einmal am Anfang als Konstante definiert werden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path

HIGHSCORES_FILE_PATH = Path("textfiles/highscores.txt")

...


    highscores = HIGHSCORES_FILE_PATH.read_text(encoding="utf-8").split(",")
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
H3llo
User
Beiträge: 20
Registriert: Montag 9. Mai 2022, 10:17

Hallo blackjack,

vielen Dank für die sehr nützlichen Hinweise!

Damit hat's geklappt! :)
Antworten