Probleme beim Programmieren eines Quizes

Fragen zu Tkinter.
Antworten
waterpoloschlumpf
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 17:29

Hallo Comunity ich bin momentan dabei ein Quiz zu programmieren. Es sollen 3 Schwierigkeitsstufen verfügbar sein und die Werte sollen in eine Datenbank eingetragen werden. Allerdings passiert bei mir wenn man die letzte Frage falsch beantwortet nichts mehr und das Programm kratzt ab. :K Ich programmiere es in Python 3.1.1. Für die anderen Schwierigkeitsstufen ist es immer das gleiche Script nur halt anderer Fragen.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: cp1252 -*-

#Versuch tkinter zu importieren
try:
    from tkinter import *
except ImportError:
    from Tkinter import *
except ImportError:
    print( "Missing tkinter!")
    exit()

#Die Funktion 'randint' aus dem Verzeichnis 'random' importieren
from random import randint
import sqlite3

vnd=""
nnd=""
kld=""
kllld=""
pl1=0
pl2=0
pl3=0
fpz=0
vn=0
nn=0
kl=0
klll=0
v=""

#[...]
fragen = {1: ("In welcher deutschen Stadt wurde der Reichstag verhüllt?",
	       "Hamburg", "Berlin", "Bonn", "Duisburg",
	       "f", "r", "f", "f",),
           2: ("Welches Tier hat das Baden Württemberg im Wappen?",
        	"Maus", "Löwe", "Bär", "Adler",
        	"f", "r", "f", "f",),
            3: ("Was gilt als König der Tiere ?",
	           "Jaguar", "Tiger", "Panter", "Löwe",
            	"f", "f","f", "r",),
            4: ("Welches Tier rollt sich bei Gefahr zu einer Kugel?",
            	"Igel", "Maus", "Ratte", "Eichhörnchen",
            	"r", "f","f", "f",),
            5: ("Welches Tier wirft kleine Erdhügel in Wiesen auf?",
            	"Wühlmaus", "Feldhamster", "Ratte", "Maulwurf",
            	"f", "f","f", "r",),
            6: ("Junge Hausschweine nennt man...",
            	"Ferkel", "Schweinchen", "Schweine Kinder", "Sau",
               	"r", "f","f", "f",),
    7: ("Welche Tiere stehen in Schweden auf den Wildwechsel-Wahrnschildern?",
	"Bären", "Schafe", "Elche", "Hirsche",
	"f", "f","r", "f",),
    8: ("Zu welcher Tiergruppe gehören Kangarus?",
	"Aufrechtgeher", "Weitspringer", "Taschenträger", "Beuteltiere",
	"f", "f","f", "r",),
    9: ("In welchem Erdteil leben Giraffen?",
	"Südamerika", "Australien", "Asien", "Afrika",
	"f", "f","f", "r",),
    10: ("Wie nennt man ein weibliches Pferd?",
	"Stute", "Weibchen", "Hengst", "Fohlen",
	"r", "f","f", "f",),
    11: ("In welchem Kontienent leben Tieger?",
	"Europa", "Afrika", "Australien", "Asien",
	"f", "f","f", "r",),
    12: ("Womit orten Fledermäuse ihre Beute?",
	"Röngenstrahlen", "Ultraschall", "Augen", "Nase",
	"f", "r","f", "f",),
    13: ("Ein Keiler ist ein...?",
	"weibliche Kuh", "männliche Kuh", "männliches Wildschwein", "weibliches Wildschwein",
	"f", "f","r", "f",)}

root=Tk()
def ql1s():
    qwindow = Toplevel(root)
    Quizzz = Quizlvl1(qwindow)
    qwindow.mainloop()

def ql2s():
    qwindow = Toplevel(root)
    Quizzz = Quizlvl2(qwindow)
    qwindow.mainloop()

def ql3s():
    qwindow = Toplevel(root)
    Quizzz = Quizlvl3(qwindow)
    qwindow.mainloop()

def quizz():
    global vnd
    global nnd
    global kld
    global kllld
    vnd=vn.get()
    nnd=nn.get()
    kld=kl.get()
    kllld=klll.get()
    lvlauswahl=Toplevel(root)
    lvl1b = Button(lvlauswahl, text="Schwierigkeitsstufe: Einfach", command=ql1s)
    lvl1b.pack()
    lvl2b = Button(lvlauswahl, text="Schwierigkeitsstufe: Mittel", command=ql2s)
    lvl2b.pack()
    lvl3b = Button(lvlauswahl, text="Schwierigkeitsstufe: Schwer", command=ql3s)
    lvl3b.pack()
#[...]
def save3():
    global pl3
    global lvl
    connection = sqlite3.connect("gewinner.db")
    savedb = connection.cursor()
    #savedb.execute("""CREATE TABLE ranking_lvl_3(vorname VARCHAR(25), nachname VARCHAR(30), klasse VARCHAR(10), klassenleitung VARCHAR(50), punkte VARCHAR(2))""")
    werte = (vnd, nnd, kld, kllld, pl3)
    savedb.execute("""INSERT INTO ranking_lvl_3 VALUES ('%s', '%s', '%s', '%s', '%s')""" %werte)
    connection.commit()
    connection.close()
#[...]
class Quizlvl3:
    global f
    def __init__(self,fenster):
        self.root = fenster
        self.root.title('Klima-Quiz (Version: 0.1)')
        self.schon_gestellt = []
        self.hauptfenster()
        self.z = 0    # initialer Wert
    def hauptfenster(self):
        ueberschrift1 = Label(self.root, text='Wer wird Millionär?')
        ueberschrift1.pack(anchor='w')
        ueberschrift2 = Label(self.root, text='Bitte die richtige Antwort '\
                              'anklicken! Erst denken dann klicken!')
        ueberschrift2.pack(anchor='w')

        self.frage = Label(self.root, text = 'Hier werden die Fragen stehen!',\
                           fg = "blue")
        self.frage.pack(padx = 5, pady = 5)

        #####>>>Die Radiobuttons:
        self.antwort = StringVar()

        whlrahmen = Frame(self.root)  # ...für die Optik!
        whlrahmen.pack()

        self.ant1 = Radiobutton(whlrahmen, text = 'Antwort 1',\
                           variable = self.antwort, value = 1)
        self.ant1.pack(anchor='w')

        self.ant2 = Radiobutton(whlrahmen, text = 'Antwort 2',\
                           variable = self.antwort, value = 2)
        self.ant2.pack(anchor='w')

        self.ant3 = Radiobutton(whlrahmen, text = 'Antwort 3',\
                           variable = self.antwort, value = 3)
        self.ant3.pack(anchor='w')

        self.ant4 = Radiobutton(whlrahmen, text = 'Antwort 4',\
                           variable = self.antwort, value = 4)
        self.ant4.pack(anchor='w')

        #####>>>Label und Entry für die Namenseingabe:
        self.ergebnis = Label(self.root, text = 'Ergebnis')
        self.ergebnis.pack(fill = BOTH, expand = 1)

        #####>>>Knöpfe zur Spielsteuerung und zum Beenden:
        self.startknopf = Button(self.root, text='Spiel starten!', fg = "red")
        self.startknopf.pack(fill = BOTH, expand = 1)
        Widget.bind(self.startknopf, '<Button-1>', self.weiter)

        endeknopf = Button(self.root, text='ENDE', command = self.root.destroy)
        endeknopf.pack(fill = BOTH, expand = 1)
    def weiter(self, e):
        self.z = randint(1, 2)  # Der Zufallsgenerator wird angeschmissen!!

    # Will der Zufallsgenarator auf eine bereits gestellte Frage zugreifen, wird
    # er nach einem Test nochmals gestartet, bis eine noch nicht gestellte Frage
    # gewählt wird!

        while self.z in self.schon_gestellt:
            self.z = randint(1, 2)  #Äandern für mehr Fraagen

    # Hier werden die bereits gestellten Fragen an die Liste angehängt:
        self.schon_gestellt.append(self.z)

        self.frage.config(text = fragen[self.z][0])

        self.ant1.config(text = fragen[self.z][1])
        self.ant2.config(text = fragen[self.z][2])
        self.ant3.config(text = fragen[self.z][3])
        self.ant4.config(text = fragen[self.z][4])
        self.ergebnis.config(text = 'Bitte wählen!', fg = "red")
        self.startknopf.config(text = 'Weiter')
        Widget.bind(self.startknopf, '<Button-1>', self.auswerten)
    def auswerten(self, e):
        global pl3
        awort = self.antwort.get()
        if fragen[self.z][eval(awort) + 4] == 'r':
            pl3=pl3+1
            if len(self.schon_gestellt) == 2: #Zahl ändern um mehr Fragen zu stell
                self.auswerten3()

            else:
                self.weiter(e)
        else:
            self.weiter(e)
    def auswerten3(self):
        if pl3 == 7:
            self.ergebnis.config(text = 'Toll du hast alles richtig '\
                                     'beantwortet!!!', fg = "black", bg = "yellow")
            self.startknopf.destroy()
            save3()

        elif pl3 == 0:
            self.ergebnis.config(text='NAJA, das geht besser!'\
                         'Du hast keine Antwort richtig beantwortet!!!'\
                         , fg = "black",\
                         bg = "yellow")
            self.startknopf.destroy()
            save3()

        elif pl3 < 7:
            self.ergebnis.config(text = 'Du hast {0} von 7 Punkten erreicht'.format(pl3), fg = "black", bg = "yellow")
            self.startknopf.destroy()
            save3()


root.title('Klima-Quiz')
f1 = Frame(root)
f1.pack()
f2 = Frame(root)
f2.pack()
f3 = Frame(root)
f3.pack()
f4 = Frame(root)
f4.pack()
vn=Entry(f1, textvariable=v)
vn.pack(side="right")
vnl=Label(f1, text="Dein Vorname:")
vnl.pack(side="left")
nn=Entry(f2)
nn.pack(side="right")
nnl=Label(f2, text="Dein Nachname:")
nnl.pack(side="left")
kl=Entry(f3)
kl.pack(side="right")
kll=Label(f3, text="Deine Klasse:")
kll.pack(side="left")
klll=Entry(f4)
klll.pack(side="right")
kllll=Label(f4, text="Deine Klassenleitung:")
kllll.pack(side="left")
but=Button(text="Das bin ich", command=quizz)
but.pack()

root.mainloop()
MFG
waterpoloschlumpf
Zuletzt geändert von Anonymous am Sonntag 1. April 2012, 18:04, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich denke es gibt hier einige Faktoren, wieso Du bisher keine Antwort bekommen hast:

1.) Der Code ist verdammt lang und *vollständig* undokumentiert!

2.) Die Fehlermeldung fehlt!

Zumindest letzteres wäre doch einfach für Dich nachzuliefern. Einfach copy & paste der Meldung aus Deiner Shell. Ersteres ist ein grundsätzliches Problem.

Der Code verrät mir schon mal, dass Du viele Grundlagen noch nicht verstanden hast und diese dringend nachholen musst. Diese ganze `global` Deklarationen sind furchtbar! `global` brauchst Du quasi *nie*. Objekte kann man mittels Parametern an Funktionen / Methoden übergeben und / oder sich als Rückgabewert liefern lassen.

"Namen sind Schall und Rauch" heißt es in einer Mundart. In Python (und allgemein in der Programmierung) sind sie jedoch essenziell! Deine Namen sind ziemlich schlecht gewählt. Hier mal ein abschreckendes Beispiel:

Code: Alles auswählen

vnd=""
nnd=""
kld=""
kllld=""
pl1=0
pl2=0
pl3=0
fpz=0
vn=0
nn=0
kl=0
klll=0
v=""
Kannst Du mir aus dem Kopf sagen, was `kllld` bedeutet? Selbst wenn Du das heute noch kannst, wird das in einigen Tagen oder Wochen auch für Dich sehr schwer werden. Namen sollten einem schon beim Lesen vermitteln, welche Art von Objekt an sie gebunden sind.
Im Moment hast Du noch den Vorteil im Code "drin zu sein". Wir hier sind das nicht und diese Art von Benennung erschwert es deutlich, sich in den Code einzulesen.

Bei der Datenstruktur zu Deinen Fragen ist mir zunächst positiv aufgefallen, dass Du Dir generell Gedanken dazu gemacht hast und alle Informationen einer Frage auch in eine Struktur gepackt hast. Das an sich ist schon mal positiv! Aber: Die Struktur ist eher suboptimal:

Code: Alles auswählen

fragen = {1: ("In welcher deutschen Stadt wurde der Reichstag verhüllt?",
               "Hamburg", "Berlin", "Bonn", "Duisburg",
               "f", "r", "f", "f",),
Du benutzt als äußere Struktur ein Dictionary, nimmst aber als Schlüssel *numerische Indizes*. In solchen Fällen kann man eigentlich immer auch eine Liste verwenden. Denn wenn Du den Schlüssel "5" kennst, kannst Du auch gleich das 4. Element einer Liste wählen ;-)
Deine Antwortoptionen sind auch eher suboptimal. `f` und `r` stehen vermutlich für "falsch" und "richtig". In Python gibt es für Wahrheitswerte den Typen `bool` mit den Werten `True` und `False`. Wieso verwendest Du nicht diese?
Desweiteren ist der Wahrheitswert einer Antwortoption im Moment nur lose, d.h. über einen äquivalenten Index, an die Antwort gekoppelt. Damit kannst Du die Antworten immer nur exakt in dieser Reihenfolge präsentieren, was den Wiederspielwert des Quizzes durchaus mindern kann. Wieso bildest Du nicht ein Tupel aus einer Antwortoption und dem Wahrheitsgehalt?

Code: Alles auswählen

("Hamburg", False), ("Berlin", True), (...), (...)
Packe ich diese Tupel z.B. in eine Liste, kann ich diese fröhlich mischen:

Code: Alles auswählen

In [3]: answers = [("Hamburg", False), ("Berlin", True), ("Bonn", False), ("Duisburg", False)]

In [4]: import random

In [5]: random.shuffle(answers)

In [6]: answers
Out[6]: [('Berlin', True), ('Bonn', False), ('Hamburg', False), ('Duisburg', False)]
Nun wäre eben Antwort eins die richtige - einfach, oder?

Nun könnte man einfach die Frage noch hinzunehmen und für eine Frage ein Dictionary aufbauen wie folgt:

Code: Alles auswählen

{
    "question": "In welcher deutschen Stadt wurde der Reichstag verhüllt?",
    "answers": [
        ("Hamburg", False), 
        ("Berlin", True), 
        ("Bonn", False), 
        ("Duisburg", False)
    ]
}
Für jede Frage baut man sich so ein Dictionary auf und packt diese in eine Liste. Damit kann man die Gesamtliste ebenfalls leicht `shufflen` und somit eine zufällige Reihenfolge generieren, in der die Fragen gestellt werden. (Oder mit `random.sample` nur eine Auswahl daraus treffen, wenn nicht alle Fragen gestellt werden sollen):

Code: Alles auswählen

questions = [
    {"question": "In welcher deutschen Stadt wurde der Reichstag verhüllt?",
      "answers": [
        ("Hamburg", False), 
        ("Berlin", True), 
        ("Bonn", False), 
        ("Duisburg", False)
    ]},
    {"question": "Welches Tier hat das Baden Württemberg im Wappen?",
      "answers": [
        ("Maus", False),
        ("Löwe", True), 
        ("Bär", False),
        ("Adler", False)
    ]},
    ... usw
]
Vorteil dieses Aufbaus wäre noch, dass man weitere Metainformationen in dem Fragen-Dict unterbringen kann, etwa so etwas wie die Schwierigkeit o.ä.

Da man seinen Code ungern mit Daten zumüllt, kann man das ganze dann noch fast gratis in einer externen Datei speichern. Ich würde dafür das JSON-Format wählen und mittels des `json`-Moduls die Daten in mein Programm laden.

Neben diese Empfehlungen würde ich Dir raten, das ganze erst einmal *ohne* GUI zu implemetieren. Wozu braucht man die hierfür? Imho kann man so ein Quiz doch hervorragend auch in einer Textshell spielen :-) Dafür kannst Du Dich auf das Wesentliche konzentrieren.

Irgend wie ist mir, dass ich schon einmal einen Vorschlag für die Datenstruktur von so einem Quiz gemacht habe... mal sehen, ob ich das noch wiederfinde :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hyperion hat geschrieben: Irgend wie ist mir, dass ich schon einmal einen Vorschlag für die Datenstruktur von so einem Quiz gemacht habe... mal sehen, ob ich das noch wiederfinde :-)
Ha... jetzt hab ich mich in diesem Forum "tot" gesucht, dabei habe ich dazu mal einige Beiträge im uu.de-Forum gepostet: Link

Vielleicht hilft Dir das auch weiter - meine Ideen dort gefallen mir sogar besser als das obige. Darüber hinaus kann man so noch leicht zusätzliche Antwortoptionen einbauen. Falsche Antworten kann es ja beliebig viele geben, mindestens jedoch drei.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi waterpoloschlumpf
waterpoloschlumpf hat geschrieben:Programm kratzt ab. :K
Es kratzt nicht ab sondern es hängt sich hier auf:

Code: Alles auswählen

        while self.z in self.schon_gestellt:
            print('Haenger')
            self.z = randint(1, 2)  #Äandern für mehr Fraagen
Gruß wuf :wink:
Take it easy Mates!
waterpoloschlumpf
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 17:29

So danke ihr beiden! :)
wuf hat geschrieben:Es kratzt nicht ab sondern es hängt sich hier auf:

Code: Alles auswählen

        while self.z in self.schon_gestellt:
            print('Haenger')
            self.z = randint(1, 2)  #Äandern für mehr Fraagen
Ich habe versucht so das zu umgehen:

Code: Alles auswählen

        if len(self.schon_gestellt) == 2:
            self.auswerten3()
        else:
            while self.z in self.schon_gestellt:
                print('Haenger')
                self.z = randint(1, 2)  #Äandern für mehr Fraagen
Allerdings erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "C:\Users\Malte\Desktop\Quiz9d.py", line 477, in auswerten
    self.weiter(e)
  File "C:\Users\Malte\Desktop\Quiz9d.py", line 464, in weiter
    self.startknopf.config(text = 'Weiter')
  File "C:\Python31\lib\tkinter\__init__.py", line 1193, in configure
    return self._configure('configure', cnf, kw)
  File "C:\Python31\lib\tkinter\__init__.py", line 1184, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: invalid command name ".32942032.32943088"
Könnt Ihr mir sagen wieso oder was ich falsch mache.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi waterpoloschlumpf

Es sieht fast so aus als ob self.startknopf vor dem Aufruf von:

Code: Alles auswählen

self.startknopf.config(text = 'Weiter')
schon mit:

Code: Alles auswählen

self.startknopf.destroy()
zerstört wurde und die Anweisung:

Code: Alles auswählen

self.startknopf.config(text = 'Weiter')
nicht mehr ausführen kann.

Gruß wuf :wink:
Take it easy Mates!
waterpoloschlumpf
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 17:29

Danke wuf für deine Idee ich habe versucht es umzusetzten mit einer if-Schleife, sodass es nur beim erstenmal geändert wird. Und zwar so:

Code: Alles auswählen

        self.schon_gestellt.append(self.z)
        if len(self.schon_gestellt) == 1:
            self.startknopf.config(text = 'Weiter')
            self.ergebnis.config(text = 'Bitte wählen!', fg = "red")
        self.frage.config(text = fragen[self.z][0])
Dabei erscheint aber folender andere Fehlercode:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "C:\Users\Malte\Desktop\Quiz9d.py", line 476, in auswerten
    self.weiter(e)
  File "C:\Users\Malte\Desktop\Quiz9d.py", line 464, in weiter
    Widget.bind(self.startknopf, '<Button-1>', self.auswerten)
  File "C:\Python31\lib\tkinter\__init__.py", line 977, in bind
    return self._bind(('bind', self._w), sequence, func, add)
  File "C:\Python31\lib\tkinter\__init__.py", line 932, in _bind
    self.tk.call(what + (sequence, cmd))
_tkinter.TclError: bad window path name ".33180272.62085936"
Was ist daran bloß falsch?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

waterpoloschlumpf hat geschrieben:Was ist daran bloß falsch?
Es gibt keine if-Schleifen, verdammt nochmal.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi waterpoloschlumpf

Musste dein Skript ein wenig entflechten damit ich es verstehen konnte. Ich habe Teile von deinem im Forum platzierten Skript einfliessen lassen. Die Funktion 'save3' musst du noch näher anschauen. Das Programm ist nur ein Prototyp, welchen du noch auf deine Bedürftnisse anpassen musst. Kann noch mehr optimiert werden.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Versuch tkinter zu importieren
try:
    import tkinter as tk
except ImportError:
    print( "Missing tkinter!")
    exit()

#Die Funktion 'randint' aus dem Verzeichnis 'random' importieren
from random import randint
import sqlite3

# Anzahl zu stellende Fragen
NUM_QUESTIONS = 3

# Verfügbare Fragen
QUESTIONS = {
        #~~ Ein Frage-Tuple setzt sich wie folgt zusammen:
        #   0    = Frage
        #   1..4 = Auswahlantworten
        #   5..8 = Antwort (codiert)
    1: ("In welcher deutschen Stadt wurde der Reichstag verhüllt?",
        "Hamburg", "Berlin", "Bonn", "Duisburg", "f", "r", "f", "f",),
    2: ("Welches Tier hat das Baden Württemberg im Wappen?",
        "Maus", "Löwe", "Bär", "Adler", "f", "r", "f", "f",),
    3: ("Was gilt als König der Tiere ?","Jaguar", "Tiger", "Panter",
        "Löwe", "f", "f","f", "r",),
    4: ("Welches Tier rollt sich bei Gefahr zu einer Kugel?",
        "Igel", "Maus", "Ratte", "Eichhörnchen", "r", "f","f", "f",),
    5: ("Welches Tier wirft kleine Erdhügel in Wiesen auf?",
        "Wühlmaus", "Feldhamster", "Ratte", "Maulwurf", "f", "f","f",
        "r",),
    6: ("Junge Hausschweine nennt man...", "Ferkel", "Schweinchen",
        "Schweine Kinder", "Sau", "r", "f","f", "f",),
    7: ("Welche Tiere stehen in Schweden auf den Wildwechsel-Wahrnschildern?",
        "Bären", "Schafe", "Elche", "Hirsche", "f", "f","r", "f",),
    8: ("Zu welcher Tiergruppe gehören Kangarus?",
        "Aufrechtgeher", "Weitspringer", "Taschenträger", "Beuteltiere",
        "f", "f","f", "r",),
    9: ("In welchem Erdteil leben Giraffen?", "Südamerika",
        "Australien", "Asien", "Afrika", "f", "f","f", "r",),
    10: ("Wie nennt man ein weibliches Pferd?", "Stute", "Weibchen",
        "Hengst", "Fohlen", "r", "f","f", "f",),
    11: ("In welchem Kontienent leben Tieger?", "Europa", "Afrika",
        "Australien", "Asien", "f", "f","f", "r",),
    12: ("Womit orten Fledermäuse ihre Beute?", "Röngenstrahlen",
        "Ultraschall", "Augen", "Nase", "f", "r","f", "f",),
    13: ("Ein Keiler ist ein...?", "weibliche Kuh", "männliche Kuh",
        "männliches Wildschwein", "weibliches Wildschwein", "f", "f",
        "r", "f",)}

LEVEL_LABEL = "Schwierigkeitsstufe: "

LEVEL_1 = "Einfach"
LEVEL_2 = "Mittel"
LEVEL_3 = "Schwer"
LEVELS = [LEVEL_1, LEVEL_2, LEVEL_3]

NAME = "Dein Vorname:"
SURNAME = "Dein Nachname:"
CLASS = "Deine Klasse:"
CLASS_DIR = "Deine Klassenleitung:"

ENTRY_NAMES = [NAME, SURNAME, CLASS, CLASS_DIR]

class QuizLevel3(tk.Toplevel):

    def __init__(self, level, callback=None):

        self.level = level
        self.callback = callback
        
        tk.Toplevel.__init__(self, app_win)
        self.title('Klima-Quiz (Version: 0.1)')

        self.schon_gestellt = []
        self.hauptfenster()
        self.question_key = 0    # initialer Wert
        self.points = 0
        
    def hauptfenster(self):
        
        ueberschrift1 = tk.Label(self, text='Wer wird Millionär?\n'+\
            "(Mit %d Fragen)" % NUM_QUESTIONS)
        ueberschrift1.pack(anchor='w')
        
        ueberschrift2 = tk.Label(self, text='Bitte die richtige '+\
            'Antwort anklicken! Erst denken dann klicken!')
        ueberschrift2.pack(anchor='w')

        self.frage = tk.Label(self,
            text = 'Hier werden die Fragen stehen!', fg = 'blue')
        self.frage.pack(padx=5, pady=5)

        #####>>>Die Radiobuttons:
        self.antwort = tk.StringVar()

        whlrahmen = tk.Frame(self)  # ...für die Optik!
        whlrahmen.pack()

        self.ant1 = tk.Radiobutton(whlrahmen, text='Antwort 1',
            variable=self.antwort, value=1)
        self.ant1.pack(anchor='w')

        self.ant2 = tk.Radiobutton(whlrahmen, text='Antwort 2',
            variable=self.antwort, value=2)
        self.ant2.pack(anchor='w')

        self.ant3 = tk.Radiobutton(whlrahmen, text='Antwort 3',
            variable=self.antwort, value=3)
        self.ant3.pack(anchor='w')

        self.ant4 = tk.Radiobutton(whlrahmen, text='Antwort 4',
            variable=self.antwort, value=4)
        self.ant4.pack(anchor='w')

        #####>>>Label und Entry für die Namenseingabe:
        self.ergebnis = tk.Label(self, text='Ergebnis')
        self.ergebnis.pack(fill='both', expand=True)

        #####>>>Knöpfe zur Spielsteuerung und zum Beenden:
        self.startknopf = tk.Button(self, text='Spiel starten!',
            fg='red')
        self.startknopf.pack(fill='both', expand = True)
        self.startknopf.bind('<Button-1>', self.weiter)

        endeknopf = tk.Button(self, text='ENDE', command=self.destroy)
        endeknopf.pack(fill='both', expand=True)

    def weiter(self, e):
        
        # Der Zufallsgenerator wird angeschmissen!!
        self.question_key = randint(1, NUM_QUESTIONS)  

        if len(self.schon_gestellt) == NUM_QUESTIONS:
            self.auswerten3()
        else:
            while self.question_key in self.schon_gestellt:
                # Will der Zufallsgenarator auf eine bereits gestellte
                # Frage zugreifen, wir der nach einem Test nochmals
                # gestartet, bis eine noch nicht gestellte Frage gewählt
                # wird!
                self.question_key = randint(1, NUM_QUESTIONS)

        self.schon_gestellt.append(self.question_key)

        self.frage.config(text = QUESTIONS[self.question_key][0])

        self.ant1.config(text = QUESTIONS[self.question_key][1])
        self.ant2.config(text = QUESTIONS[self.question_key][2])
        self.ant3.config(text = QUESTIONS[self.question_key][3])
        self.ant4.config(text = QUESTIONS[self.question_key][4])
        
        self.ergebnis.config(text='Bitte wählen!', fg="red")
        self.startknopf.config(text='Weiter')
        self.startknopf.bind('<Button-1>', self.auswerten)

    def auswerten(self, e):

        answer = self.antwort.get()
        print('Antwort = %s Punkte = %d' % (answer, self.points))
        
        if QUESTIONS[self.question_key][eval(answer)+4] == 'r':
            self.points += 1
            
        if len(self.schon_gestellt) == NUM_QUESTIONS:
            self.auswerten3()
        else:
            self.weiter(e)
            
    def auswerten3(self):
        
        print('Auswertung:',self.points)
        
        if self.points == NUM_QUESTIONS:
            self.ergebnis.config(text = "Toll du hast alles richtig"+\
                "beantwortet!!!",
                fg='black', bg='yellow')
            self.save_quiz()

        elif self.points == 0:
            self.ergebnis.config(
                text="NAJA, das geht besser! "+\
                "Du hast keine Antwort richtig beantwortet!!!", 
                fg='black', bg='yellow')
            self.save_quiz()

        elif self.points < NUM_QUESTIONS:
            self.ergebnis.config(
                text="Du hast %d von max. %d Punkten erreicht" % (
                self.points, NUM_QUESTIONS), fg='black', bg='yellow')
            self.save_quiz()

    def save_quiz(self):
        
        self.startknopf.destroy()
        
        if self.callback:
            self.callback(self.level, self.points)
        
def level_choice():

    choice_win = tk.Toplevel(app_win)
    [tk.Button(choice_win, text=LEVEL_LABEL+level,
        command=lambda quiz_level=level: quiz_switch(quiz_level)).
        pack(fill='x')
        for level in LEVELS]
    
def quiz_switch(quiz_level):
    
    if quiz_level == LEVEL_1:
        print('Nicht implementiert')
        #quiz = QuizLevel(quiz_level, save3)
        
    if quiz_level == LEVEL_2:
        print('Nicht implementiert')
        #quiz = QuizLevel(quiz_level, save3)
        
    if quiz_level == LEVEL_3:
        quiz = QuizLevel3(quiz_level, save3)
        
def save3(level, points):
    
    print
    print('Name          :', entries[NAME].get())
    print('Vorname       :', entries[SURNAME].get())
    print('Klasse        :', entries[CLASS].get())
    print('Klassenleitung:',entries[CLASS_DIR].get())
    print('Level         :', level)
    print('Punkte        :', points)
     
    return
    connection = sqlite3.connect("gewinner.db")
    savedb = connection.cursor()
    
    savedb.execute("""CREATE TABLE ranking_lvl_3(vorname VARCHAR(25),
        nachname VARCHAR(30), klasse VARCHAR(10),
        klassenleitung VARCHAR(50), punkte VARCHAR(2))""")
        
    werte = (entries[NAME].get(), entries[SURNAME].get(),
        entries[CLASS].get(), entries[CLASS_DIR].get(), points)
        
    savedb.execute("""INSERT INTO ranking_lvl_3 VALUES (
        '%s', '%s', '%s', '%s', '%s')""" %werte)
        
    connection.commit()
    connection.close()
    
app_win = tk.Tk()
app_win.title('Klima-Quiz')

main_frame = tk.Frame(app_win)
main_frame.pack(padx=4, pady=2)

entries = dict()
    
for entry_name in ENTRY_NAMES:
    frame = tk.Frame(main_frame)
    frame.pack(pady=1)
    label_obj = tk.Label(frame, text=entry_name, width=18, anchor='e')
    label_obj.pack(side='left')
    var = tk.StringVar()
    entry_obj = tk.Entry(frame, bg='white', textvar=var, width=15,
        highlightthickness=0)
    entry_obj.pack(side='left')
    entries[entry_name] = var

but = tk.Button(app_win, text="Das bin ich", command=level_choice)
but.pack()

app_win.mainloop()
Verwendete:

Code: Alles auswählen

# -*- coding: utf-8 -*-
Gruß wuf :wink:
Take it easy Mates!
waterpoloschlumpf
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 17:29

Vielen Dank wuf!!! :D Jetzt hab ich ein fast fertiges Quiz, auch wenn ich nur Hilfe gewollt habe.
Johnson
User
Beiträge: 6
Registriert: Donnerstag 7. Juni 2012, 16:09

waterpoloschlumpf hat geschrieben:Vielen Dank wuf!!! :D Jetzt hab ich ein fast fertiges Quiz, auch wenn ich nur Hilfe gewollt habe.
Manchmal geht es doch schneller als man denkt. Wenn du magst, kann ich das Quiz mal testen :)
Antworten