Quiz

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
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Hallo ich habe versucht ein Quiz zu erstellen leider funktioniert es nicht, kann mir jemand helfen?
Es gibt ohne das man einen Knopf drückt "Falsch" an

Code: Alles auswählen

from tkinter import *


top = Tk()

#Zahl welche zum antwort und frage zu überprüfen genutzt wird
zahl = 0

# Prüfer ob eingabe mit lösung übereinstimmt
def prüfung(buchstabe):
    if lösungen_tabelle[zahl] == buchstabe:
        richtig = Label(top, text="Richtig")
        richtig.grid(row=3, column=1)
    else:
        falsch = Label(top, text="Falsch")
        falsch.grid(row=3, column=1)




#  1 Label [Die Frage]     3 Button [A B C]    2 Bilder [Richtig oder Falsch]

# Tabelle der fragen
fragen_tabelle = ["Haupstadt Deutschland?"]

# Tabelle der Lösungen
lösungen_tabelle = ["a"]

# Tabelle der Antwortmöglichkeiten
antwort_tabelle = ["Berlin", "München", "Hamburg"]


# Die Frage als label aus einer tabelle ausgegeben
# Der text entspricht der nummer von zahl in der tabelle
Frage = Label(top, text=fragen_tabelle[zahl])
Frage.grid(row=0, columnspan=2)

# Ausgabe Antwortmöglichkeiten
# antwort 1
antwort_1 = Label(top, text=antwort_tabelle[zahl])
antwort_1.grid(row=1, column=0)
# antwort 2
antwort_2 = Label(top, text=antwort_tabelle[zahl + 1])
antwort_2.grid(row=1, column=1)
#antwort 3
antwort_3 = Label(top, text=antwort_tabelle[zahl + 2])
antwort_3.grid(row=1, column=2)

# Buttons mit A B oder C

# A
button_A = Button(top, text="A", width=7, height=2)
button_A.grid(row=2, column=0)
# B
button_B = Button(top, text="B", width=7, height=2)
button_B.grid(row=2, column=1)
# C
button_C = Button(top, text="C", width=7, height=2)
button_C.grid(row=2, column=2)

#Button Ausgabe
button_A.bind("<Button-1>",prüfung("a"))

button_B.bind("<Button-1>",prüfung("b"))

button_C.bind("<Button-1>",prüfung("c"))




top.mainloop()
Zuletzt geändert von Anonymous am Sonntag 9. Juli 2017, 12:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Brevista: Du musst `bind()` auch eine Funktion oder Methode übergeben. Du rufst die Funktion `prüfung()` aber auf und übergibst dann deren Rückgabewert. Und der ist `None` weil `prüfung()` nichts explizit zurück gibt.

Aber das Programm hat noch so einige weitere Probleme. Das fängt mit globalen Variablen an — fang mit so etwas gar nicht erst an. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Dann hast Du drei parallele Listen in denen die Werte am gleichen Index jeweils zusammengehören. Die Daten gehören deshalb in *eine* Liste. Die Lösungen würde ich nicht speichern sondern Beispielsweise immer die erste Antwort die richtige sein lassen. Zur Anzeige bringt man die dann in einer zufälligen Reihenfolge.

Die Aktion für eine Schaltfläche legt man mit der `command`-Option fest und nicht mit `bind()`. Bei `bind()` verhält sich die Schaltfläche nicht so wie der Spieler das von Schaltflächen gewohnt ist.

Du erstellst die GUI-Elemente jeweils dann wen Du sie brauchst. Das funktioniert hier bei *einer* Frage noch, aber bei mehreren geht das nicht mehr. Normalerweise erzeugt man die GUI-Elemente am Anfang und verändert sie dann im Laufe des Programms entsprechend.

Für GUI-Programmierung müsstest Du vorher am besten objektorientierte Programmierung lernen, denn die braucht man für grafische Oberflächen. Bei sehr einfachen GUIs kommt man noch mit `functools.partial()` davon ohne das es ”unpythonisch” wird, aber da kommt man nicht wirklich weit mit.
Brevista
User
Beiträge: 32
Registriert: Sonntag 2. Juli 2017, 00:48

Danke für deine Antwort @BlackJack
Hast du Tipps wo und wie ich Python lernen kann.
Bis jetzt kann ich leider nur die grundlegensten Grundlagen, und weiß nicht ob ich mich durch Foren klicken soll, Videos-Tutorials ansehen oder mir ein buch bestellen soll, falls jemand Tipps hat gerne schreiben oder wie ihr Python gelernt habt!
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Also es gibt zum einen die Webseite open.hpi.de. Dort kannst du sehr viele Kurse, insbesondere auch Python lernen.

Zum anderen kannst du auch bei http://www.python-kurs.eu von Kapitel zu Kapitel dich durcharbeiten.

Auch noch gibt es http://cscircles.cemc.uwaterloo.ca/
BlackJack

@Brevista: Ich habe Python angefangen mit dem Tutorial in der Python-Dokumentation zu lernen. Das fängt wirklich grundlegend an, und bietet einen ganz guten ”Rundgang” durch die Sprache. Das Tutorial sollte man nicht nur passiv lesen, sondern durcharbeiten. Das heisst alle Beispiele ausprobieren und auch ein bisschen damit herum spielen. Das man Python interaktiv in einer Python-Shell ausführen kann, ist dabei IMHO ein grosser Pluspunkt, weil man ”live” mit Code experimentieren kann.
BlackJack

Mal ein Ansatz (nahezu ungetestet):

Code: Alles auswählen

import random
from functools import partial
import tkinter as tk


def shuffled(iterable):
    result = list(iterable)
    random.shuffle(result)
    return result


class QuizUI(tk.Frame):

    def __init__(self, parent, fragen):
        tk.Frame.__init__(self, parent)
        self.frage_label = tk.Label(self)
        self.frage_label.grid(row=0, columnspan=3)
         
        self.antwort_labels = list()
        for i in range(3):
            label = tk.Label(self)
            label.grid(row=1, column=i)
            self.antwort_labels.append(label)

        for i, text in enumerate('ABC'):
            button = tk.Button(
                self,
                text=text,
                width=7,
                height=2,
                command=partial(self.antwort_pruefen, i),
            )
            button.grid(row=2, column=i)

        self.ergebnis_label = tk.Label(self)
        self.ergebnis_label.grid(row=3, column=1)

        self.fragen = iter(fragen)
        self.richtige_antwort_index = None
        self.stelle_frage()

    def stelle_frage(self):
        try:
            frage, antworten = next(self.fragen)
        except StopIteration:
            self.frage_label['text'] = 'Keine Fragen mehr.'
            for label in self.antwort_labels:
                label['text'] = ' '
        else:
            richtige_antwort = antworten[0]
            self.frage_label['text'] = frage
            self.richtige_antwort_index = None
            for index, (label, antwort) in enumerate(
                zip(self.antwort_labels, shuffled(antworten))
            ):
                label['text'] = antwort
                if antwort == richtige_antwort:
                    self.richtige_antwort_index = index
            assert self.richtige_antwort_index is not None

    def antwort_pruefen(self, index):
        self.ergebnis_label['text'] = (
            'Richtig' if index == self.richtige_antwort_index else 'Falsch'
        )
        self.stelle_frage()


def main():
    fragen = [
        ('Haupstadt Deutschland?', ['Berlin', 'München', 'Hamburg']),
        ('Beste Programmiersprache?', ['Python', 'Java', 'C++']),
    ]
    root = tk.Tk()
    root.title('Quiz')
    quiz_ui = QuizUI(root, fragen)
    quiz_ui.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
Antworten