(Kivy) Quizauswertung mit bestehendem / neuem Screen / Popup

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 möchte ein Quiz machen, bei dem der Spieler sagen soll, ob eine Behauptung stimmt oder nicht stimmt.

Nachdem der Spieler geantwortet hat, soll die Antwort natürlich ausgewertet werden. Wenn die Antwort richtig ist,
soll der Score des Spielers hoch gesetzt werden, wenn die Antwort falsch ist, soll das Spiel beendet werden,
der Score des Spielers soll ggf. in der Liste der Highscores gespeichert werden und der Spieler soll natürlich
auch benachrichtigt werden, falls sein Score im Highscore gelandet ist. Falls die Behauptung nicht stimmt,
soll außerdem die Behauptung so angezeigt werden, wie sie korrekt ist (also die Behauptung ist zum Beispiel
"Madrid ist die Hauptstadt von Frankreich" - dann soll "Madrid ist die Hauptstadt von Spanien" angezeigt werden).

Meine Frage ist: Wie kann ich die Auswertung der Antwort hinsichtlich des UI sinnvoll umsetzen? Kann man den gleichen Screen
benutzen (z. B. indem man ein neues Layout mit neuen Grafikelementen lädt (Geht das?)), kann man einen neuen Screen benutzen
(Wie "übergebe" ich den Score, die Behauptung und die Antwort des Nutzers vom alten zum neuen Screen?) oder kann man ein
"Popup"-Fenster nutzen (auch hier die Fragen: Wie "übergebe" ich den Score, die Behauptung und die Antwort des Nutzers vom
Screen zum Popup-Fenster?). Ich hoffe, mein Problem ist verständlich. Bin dankbar für alle Antworten!

Hier mein Code:

Buttons, die der Spieler nutzt, um zu antworten; aus der kv-Datei:

Code: Alles auswählen

Button:
                    text: "Ja"
                    font_name: "fonts/GloriaHallelujah-Regular.ttf"
                    font_size: "25dp"
                    background_normal: ''
                    background_color: 0, 0, 0, 0
                    color: .63, .63, 0, 1
                    on_press: root.antwort_pruefen(True)
                    size_hint: 1, 1
Button:
                    text: "Nein"
                    font_name: "fonts/GloriaHallelujah-Regular.ttf"
                    font_size: "25dp"
                    background_normal: ''
                    background_color: 0, 0, 0, 0
                    color: .63, .63, 0, 1
                    on_press: root.antwort_pruefen(False)
                    size_hint: 1, 1
Klasse Quiz aus der main-Datei:

Code: Alles auswählen

class Quiz(Screen):

    score = StringProperty("0")
    frage_und_richtige_behauptung = frageErmitteln()
    frage = StringProperty(frage_und_richtige_behauptung[0])
    korrekte_behauptung = StringProperty(frage_und_richtige_behauptung[1])
    
    def antwort_pruefen(self, antwort):
        if antwort == True and self.korrekte_behauptung == "" or antwort == False and self.korrekte_behauptung != "":
            self.score = str(int(self.score) + 1000)
        self.frage_und_richtige_behauptung = frageErmitteln()
        self.frage = self.frage_und_richtige_behauptung[0]
        self.korrekte_behauptung = self.frage_und_richtige_behauptung[1]
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

H3llo
User
Beiträge: 20
Registriert: Montag 9. Mai 2022, 10:17

Ich weiß nicht, ob es damit schon geklärt ist, aber meine Frage ist, wie ich eine Variable, z. B. "antwort" (in der die Antwort des Spielers gespeichert ist) vom ersten, dem "Quiz"-Screen, zum zweiten, dem "Auswertungs"-Screen, übergebe.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die teilen. Zb indem du die aus dem einen Screen in den anderen übergibst in dem Code, der durch die Eingabe der Antwort ausgelöst wird.
H3llo
User
Beiträge: 20
Registriert: Montag 9. Mai 2022, 10:17

Kannst du mir zeigen, wie der Code dafür beispielhaft aussehen würde?
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

schau dir mal meine kv-Datei an, zum Beispiel das Internetradio mit der Lautstärkeeinstellung. Das Prinzip müsstest du anwenden können. Nur halt auf einen weiteren Screen übergeben.
https://forum-raspberrypi.de/forum/thre ... hgeraeten/

Grüße
Dennis

Edit: Bin am Handy, deswegen nur der Link und du musst dir die Stelle selbst aussuchen.
"When I got the music, I got a place to go" [Rancid, 1993]
H3llo
User
Beiträge: 20
Registriert: Montag 9. Mai 2022, 10:17

Das klappt bei mir nicht. Ich habe das jetzt mal so gemacht:

main.py

Code: Alles auswählen

from kivy.app import App
from kivy.properties import StringProperty
from kivy.properties import BooleanProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from pathlib import Path
import random

# Fragen
fragen = [
    ["Christoph Kolumbus entdeckte 1492 Amerika", ""],
    ["Die USA hat 15 Gründungsstaaten", "Die USA hat 13 Gründungsstaaten"],
    ["Das chemische Kürzel für Gold ist Gd.", "Das chemische Kürzel für Gold ist Au."],
]

def default(dt):
    pass

class Startseite(Screen):
    pass

class Quiz(Screen):
    score = StringProperty("0")
    fragennummer = random.randint(0, len(fragen) - 1)
    frage = StringProperty(fragen[fragennummer][0])
    antwort = BooleanProperty(True)

class Auswertung(Screen):
    pass

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("layout.kv")

class StimmtsQuiz(App):
    def build(self):
        return kv

if __name__ == "__main__":
    StimmtsQuiz().run()
kv-Datei

Code: Alles auswählen

WindowManager:
    Startseite:
    Quiz:
    Auswertung:

<Startseite>:
    name: "startseite"
    ...

<Quiz>:
    name: "quiz"
    Image:
        source:"images/hintergrundbild_weiss.png"
        allow_stretch: True
        keep_ratio: False
    BoxLayout:
        orientation: "vertical"
        StackLayout:
            StackLayout:
                size_hint: 1, .3
                Label:
                    text: "Score: " + root.score
                    font_name: "fonts/GloriaHallelujah-Regular.ttf"
                    font_size: "25dp"
                    color: .63, .63, 0, 1
                    size_hint: .5, 1
                Image:
                    source: "images/stimmtes.png"
                    allow_stretch: True
                    size_hint: .5, 1
            BoxLayout:
                size_hint: 1, .7
                BoxLayout:
                    orientation: "horizontal"
                    BoxLayout:
                        size_hint: .05, 1
                    BoxLayout:
                        Label:
                            text_size: .8 * root.width, None
                            size: self.texture_size
                            text: root.frage
                            halign: 'center'
                            valign: 'center'
                            font_name: "fonts/GloriaHallelujah-Regular.ttf"
                            font_size: "25dp"
                            color: .63, .63, 0, 1
                            size_hint: .9, 1
                    BoxLayout:
                        size_hint: .05, 1
        BoxLayout:
            orientation: "vertical"
            BoxLayout:
            BoxLayout:
                Button:
                    text: "Ja"
                    font_name: "fonts/GloriaHallelujah-Regular.ttf"
                    font_size: "25dp"
                    background_normal: ''
                    background_color: 0, 0, 0, 0
                    color: .63, .63, 0, 1
                    on_press:
                        root.antwort = True
                        app.root.current = "auswertung"
                    size_hint: 1, 1
                Button:
                    text: "Nein"
                    font_name: "fonts/GloriaHallelujah-Regular.ttf"
                    font_size: "25dp"
                    background_normal: ''
                    background_color: 0, 0, 0, 0
                    color: .63, .63, 0, 1
                    on_press:
                        root.antwort = False
                        app.root.current = "auswertung"
                    size_hint: 1, 1

<Auswertung>:
    name: "auswertung"
    BoxLayout:
        orientation: "vertical"

Was ich aber immernoch nicht weiß ist, wie ich der Klasse Auswertung die Werte der Variable score, fragennummer und antwort aus der Klasse Quiz übergebe, um diese dort zu verwenden.
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich würde sagen, mach mal eine "richtige" Klase aus 'Quiz' mit einer '__init__' und 'self', dann kannst du doch auf die Objekte zugreifen mit 'Quiz.score' z.B.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten