Wie starte ich die While Schleife in Python neu?
Hallo!
Ich programmiere aktuell einen "Vokabelabfrager". Dazu hätte ich eine Frage. Und zwar arbeite ich grafisch mit Tkinter. Doch ich bin gerade in einer While Schleife, in der alles funktioniert, aber dann will die While Schleife sich nicht mehr neustarten, denn sie hat schon erledigt was sie machen sollte, und will nicht weiter abfragen, weil sie dies schon gemacht hat.
Das ist ein Ausschit meines Codes:
weiter = False
def Prüfungs_Start():
global weiter
weiter = True
while weiter == True:
weiter = False
Prüfungs_Start_Fenster = Tk()
Prüfungs_Start_Fenster.title("Prüfung")
Prüfungs_Start_Fenster.geometry("400x500")
#Random Zeile finden
Datei = open("Vokabeln.txt", "a")
Datei = open("Vokabeln.txt", "r")
Datei_Anzahl_Zeilen = 0
for Zeile in Datei:
Datei_Anzahl_Zeilen += 1
Datei.seek(0)
Randomzeile = randint(1, Datei_Anzahl_Zeilen)
Zähler = 1
for Zeilen_Inhalt in Datei:
if Zähler == Randomzeile:
Random_Zeilen_Inhalt = Zeilen_Inhalt
Zähler += 1
#2 Vokabeln, die in der ausgewählten Zeile stehen, in 2 Variablen speichern
Ort = Random_Zeilen_Inhalt.find("'")
TestVokabel1 = Random_Zeilen_Inhalt[0:Ort]
TestVokabel2 = Random_Zeilen_Inhalt[Ort+1:-1]
Label(Prüfungs_Start_Fenster, text = f"Ausgangs-Vokabel: {TestVokabel1}", font = "Arial_Black 20").place(x = 10, y = 10)
Eingegebenes_Ergebnis = Entry(Prüfungs_Start_Fenster)
Eingegebenes_Ergebnis.place(x = 10, y = 50)
def Prüfung():
if Eingegebenes_Ergebnis.get() == TestVokabel2:
Label(Prüfungs_Start_Fenster, text = "Richtig! ", font = "Arial 21", fg = "green").place(x = 10, y = 180)
else:
Label(Prüfungs_Start_Fenster, text = "Leider falsch", font = "Arial 21", fg = "red").place(x = 10, y = 180)
Button(Prüfungs_Start_Fenster, text = "Fertig", command = Prüfung).place(x = 10, y = 100)
def Weiter():
global weiter
weiter = True
Prüfungs_Start_Fenster.destroy()
Button(Prüfungs_Start_Fenster, text = "Weiter", command = Weiter).place(x = 10, y = 130)
Nun habe ich hinten diesen "Weiter" Button, der die Variable "weiter" wieder auf einen anderen Wert weisen soll, um die While Schleife wieder laufen zu lassen. Das möchte sie aber wohl nicht, denn sie hat ja schon abgefragt und da hat es nicht gestimmt.
Wenn ihr wisst, wie ich es schaffen kann, dass die While Schleife neu abfragt, bitte hilft mir,
euer Alex
2 Antworten
GUI-Toolkits wie Tkinter haben ihre eigene (Event) Loop. Sobald während der Ausführungszeit ein Ereignis auf der Oberfläche getriggert wird, kann man dieses abfangen und behandeln. Ein Beispiel dafür siehst du beim Button. Bei Klick wird die Funktion aufgerufen, auf die sein command-Attribut zeigt.
Es reicht daher aus, nur ein Fenster zu zeichnen und alle Daten aus deiner Textdatei anfangs einmal einzulesen. Eine Liste an Objekten oder ein Dictionary wären hierfür geeignet.
Dann wäre eine Funktion notwendig, die eine zufällige Vokabel zur Abfrage ermittelt. Die wird einmal zu Programmstart genutzt und einmal, sobald eine Vokabel geprüft wurde. Die Texte der Labels (u.ä.) können zwischenzeitlich mit configure geändert werden.
Ich habe dein Skript dementsprechend einmal umgeändert.
import random
from tkinter import *
def check_input():
if input_field.get() == translation:
output_label.configure(text="Richtig!", fg="green")
else:
output_label.configure(text="Leider falsch!", fg="red")
setup()
def setup():
global word, translation
word, translation = random.choice(list(vocabularies.items()))
label.configure(text=f"Ausgangsvokabel: {word}")
vocabularies = {}
with open("vocabularies.txt", "r") as file:
for line in file:
words = line.strip().split(",")
vocabularies[words[0]] = words[1]
window = Tk()
window.title("Prüfung")
window.geometry("400x500")
label = Label(window, font="Arial_Black 20")
label.place(x=10, y=10)
input_field = Entry(window)
input_field.place(x=10, y=50)
output_label = Label(window, font="Arial 21")
output_label.place(x=10, y=180)
start_button = Button(window, text="Prüfen", command=check_input)
start_button.place(x=10, y=100)
setup()
window.mainloop()
Für die Vokabeln habe ich ein anderes Datenformat als du verwendet. Bei mir würde je Zeile ein Vokabelpaar stehen, getrennt durch ein Komma.
Danke für deine Umänderung. Das Problem habe ich jetzt behoben. :D
While schleife in Funktion
Funktion aufrufen bei weiter
Aber das ist dann ja in der While Schleife. Wie soll ich eine Funktion in einer Funktion aufrufen? Kommt das dann nicht zu einem Fehler?
def Fun():
print("Start Funktion")
Fun()
print("Ende Funktion")