Vokabeltrainer - GUI

Fragen zu Tkinter.
Antworten
Arabio
User
Beiträge: 5
Registriert: Montag 25. Oktober 2021, 08:20

Guten Tag!
Ich habe mir letztens, nach Anleitung eines Youtube Videos, ein Vokabeltrainer programmiert.
Dieser hat auch perfekt funktioniert. Nun möchte ich diesen allerdings eine GUI (mit Hilfe von Tkinter) geben und bin nun schon seit mehreren Tagen am verzweifeln.
Warum werden die Buttons direkt ausgeführt nachdem ich sie definiert habe? Und irgendwie funktioniert das "Inserten" und das Auslesen aus der Textbox nicht.

Ich weiß nicht ob ich mich einfach nur zu blöd anstelle, aber bitte habt ein bisschen Nachsicht, denn ich habe keinerlei Erfahrungen mit Tkinter und programmiere auch noch nicht sehr lange mit Python: :|

Code: Alles auswählen

from tkinter import *
class Eintrag:
    def __init__(self, deutsch, englisch):
        self.deutsch = deutsch
        self.englisch = englisch
    def toString(self):
        return self.deutsch + " - " + self.englisch
    def speichern(self):
        return self.deutsch + "\n" + self.englisch + "\n"
def Füller():
    x = 1
fenster = Tk()
fenster.title("Vokabeltrainer")
fenster.geometry("550x550")
Textbox = Text(fenster, height=20, width=30)
Textbox.pack()
Textbox.place(x=127.5, y=40)
Überschrift = Label(text="Vokabeltrainer")
Überschrift.config(font=("Times", 20),)
Überschrift.pack()
def deutscheingabe():
    deutsch = Textbox.get(1.0, END)
def eingabe():
    Textbox.insert(1.0, "Schreibe das deutsche Wort")
    #Textbox.insert(1.0, "Schreibe das englische Wort")
    #if weiter gedrückt:
        #englisch = Textbox.get(1.0, END)
        #eintraege.append(Eintrag(deutsch,englisch))
buttonweiter = Button(master=fenster, text="weiter", command=deutscheingabe())
buttonweiter.place(x=400, y=200, width=100, height=25)
buttonEingabe = Button(master=fenster, text="neue Vokabeln eingeben!", command=eingabe())
buttonEingabe.place(x=150, y=400, width=200, height=25)
buttonAbfragen = Button(master=fenster, text="Vokabeln abfragen", command=Füller())
buttonAbfragen.place(x=150, y=450, width=200, height=25)
buttonAusgabe = Button(master=fenster, text="alle Vokabeln anzeigen", command=Füller())
buttonAusgabe.place(x=150, y=500, width=200, height=25)
mainloop()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil du sie nunmal direkt ausfuehrst. Wenn du "eingabe()" schreibst, dann passiert das, was bei eingabe() passiert. Was sonst sollte passieren?

Was du stattdessen machen musst, ist nur "eingabe" (und so weiter) zu uebergeben. Das ist dann nur die Referenz auf das aufrufbare Ding, dass man bei einen Druck auf den Knopf aufgerufen haben will.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist ein typischer Fehler, dass Du den Rückgabewert des Aufrufs der Funktion `deutscheingabe` als Callback für den Button angibst, statt die Funktion an sich.

Code: Alles auswählen

buttonweiter = Button(master=fenster, text="weiter", command=deutscheingabe)
GUI-Programmierung erfordert eine ganz andere Denkweise.
Man muß den Zustand zwischen verschiedenen Callbacks speichern, dazu braucht man Klassendefinitionen. Globale Variablen sollte man nicht benutzen.
Alles, was jetzt auf oberster Ebene steht und keine Funktions- oder Klassedefinition ist, muß in Funktionen wandern, damit man erst gar nicht in Versuchung kommt, globale Variablen zu verwenden.
*-Importe benutzt man nicht.
Und auch kein place mit absoluten Positionsangaben, sondern grid oder pack.
Variablennamen werden wie Funktionen komplett klein geschrieben.

Eintrag.toString sollte Eintrag.__str__ heißen, damit Instanzen automatisch in Strings umgewandelt werden können. Eintrag.speichern ist nicht sehr gut, weil es suggeriert, dass es eine Datei gibt, in der jede zweite Zeile eine andere Bedeutung hat. Das ist kein gutes Dateiformat, weil sehr fehleranfällig und kompliziert zu lesen. Benutze Standardformate wie JSON oder CSV.
Antworten