Eine Variable mit einer button-Funktion ändern

Fragen zu Tkinter.
Antworten
anonym106

Moin!

Kurz zur Erläuterung:
Ich möchte ein kleines Vokabeltrainerprogramm mit Anmeldemaske erstellen.
Es ist nur für Hobbyzwecke. Anmeldename und Passwort sind hart kodiert. Ist für mich erstmal in Ordnung. Ist der nächste Punkt, aber darum geht es erstmal nicht.
Mit einer globalen Variable "richtig" funktioniert es, aber das möchte ich versuchen zu umgehen.
Ich übergebe die Variable "richtig" mit Hilfe von Lamda, im "command Teil" des Antwort Buttons.
Soweit so gut.
Nach dem Check, ob es stimmt, oder nicht, wird die Variable "richtig" neu gesetzt, damit ein neues richtiges Wort gesetzt wird.
Da es sich ja aber um eine Funktion handelt, muss ich das neue "richtig" doch irgendwohin übergeben.
Aber wohin?
Derzeit bleibt die die Variable "richtig" außerhalb der Check-Funktion immer gleich.
Ich habe keine Ahnung, wie ich das hier bei Tkinter mache.
Kann mir da jemand helfen?


Hier mal mein Code:

Code: Alles auswählen

from tkinter import *
from tkinter import messagebox
from random import choice
import vlc

# Hintergrundmusik
url = "https://stream.laut.fm/lofi"
instance = vlc.Instance('--input-repeat=-1', '--fullscreen')
player=instance.media_player_new()
media=instance.media_new(url)
player.set_media(media)
player.play()


#Fenster wird gebaut
root = Tk() #Fenster erzeugen
root.title("Vokabeltrainer") #Fenstertitel
#root.geometry("600x600") #Fenstergröße
root.attributes("-fullscreen", True)  # Vollbild aktivieren


#Hintergrundbild
bg = PhotoImage(file = "img/bg1.png")
bg_label = Label(root, image = bg)
bg_label.grid(row = 0, column = 0, rowspan = 11, columnspan = 11)

def anmelden(): 
    if benutzer_entry.get() == "emma" and passwort_entry.get() == "check":
        benutzer_entry.delete(0, "end")
        passwort_entry.delete(0, "end")
        benutzer_entry.insert(0, "Benutzername")
        passwort_entry.insert(0, "Passwort")
        screen = Toplevel(root)
        screen.title("Vokabeltrainer Programmstart") #Fenstertitel
        screen.attributes("-fullscreen", True)  # Vollbild aktivieren
        
        bg = PhotoImage(file = "img/bg1.png")
        bg_label = Label(screen, image = bg)
        bg_label.grid(row = 0, column = 0, rowspan = 11, columnspan = 11)
        
        englisch_woerterbuch = {"Haus":"house", "Auto":"car", "Wolke":"cloud", "Sonne":"sun", "Stift":"pencil", "Tisch":"table"}
        woerterliste = []
        for i in englisch_woerterbuch:
            woerterliste.append(i)
        gegeben_wort = choice(woerterliste)
        richtig = englisch_woerterbuch[gegeben_wort]
        
        def check(richtig):           
            if antwort_entry.get() == richtig:
                richtig_label.config(text= "! RICHTIG !", fg = "green" )
                player = vlc.MediaPlayer('sfx/right.mp3')
                player.play()
                player.get_instance() 
                gegeben_wort = choice(woerterliste)
                wort_label.config(text = gegeben_wort)
                richtig = englisch_woerterbuch[gegeben_wort]
                antwort_entry.delete(0, "end")
            else:
                richtig_label.config(text= "! Leider falsch !", fg = "red" )
                gegeben_wort = choice(woerterliste)
                wort_label.config(text = gegeben_wort)
                richtig = englisch_woerterbuch[gegeben_wort]
                antwort_entry.delete(0, "end")
    
        
        
        wort_label = Label (screen, text = gegeben_wort , font = ("", "40"), fg = "black", bg = "lightblue")
        wort_label.grid(row = 4, column = 0, columnspan = 11)
        
        antwort_entry = Entry (screen, text = "" , font = ("", "30"), fg = "black", bg = "lightblue", justify="center")
        antwort_entry.grid(row = 5, column = 0, columnspan = 11)
        
        richtig_label = Label (screen , font = ("", "10"), fg = "green", bg = "lightblue")
        richtig_label.grid(row = 6, column = 0, columnspan = 11, sticky = "n")
        
        antwort_button = Button (screen, text = "Antworten" , font = ("", "30"), fg = "white", bg = "green", border = 2,  command = lambda: check(richtig))
        antwort_button.grid(row = 8, column = 0, columnspan = 11)
        
        abmelden_button = Button (screen, text = "Abmelden" , font = ("", "30"), fg = "white", bg = "green", border = 2,  command = screen.destroy)
        abmelden_button.grid(row = 9, column = 0, columnspan = 11)
         
        exit_button = Button (screen, text = "EXIT" , font = ("", "50"), fg = "white", bg = "brown", border = 4,  command = root.destroy)
        exit_button.grid(row = 10, column = 0)
        
        screen.mainloop()
    else:
        #messagebox.showerror(title="Login Fehlgeschlagen", message="Benutzername und/oder Passwort ist falsch")
        error_label.config(text = "- Benutzername und/oder Passwort ist falsch -", fg = "white", bg ="red")
        
# Layout erzeugen
benutzer_entry = Entry (root, text = "" , font = ("", "30"), fg = "white", bg = "green", border = 2)
benutzer_entry.grid(row = 5, column = 0, columnspan = 11)
benutzer_entry.insert(0, "Benutzername")

passwort_entry = Entry (root, text = "" , font = ("", "30"), fg = "white", bg = "green", border = 2, show = "*")
passwort_entry.grid(row = 6, column = 0, columnspan = 11)
passwort_entry.insert(0, "Passwort")

anmelden_button = Button (root, text = "Anmelden" , font = ("", "30"), fg = "white", bg = "green", border = 2,  command = anmelden)
anmelden_button.grid(row = 7, column = 0, columnspan = 11)

error_label = Label (root, font = ("", "20"), bg="#99e11b")
error_label.grid(row = 8, column = 0, columnspan = 11, sticky = S)

exit_button = Button (root, text = "EXIT" , font = ("", "50"), fg = "white", bg = "brown", border = 4,  command = root.destroy)
exit_button.grid(row = 10, column = 0)

version_label = Label (root, text = "  Version 0.1  " , font = ("", "10"), fg = "yellow", bg = "brown", border = 0)
version_label.grid(row = 10, column = 10, sticky = SE)


root.mainloop()

nezzcarth
User
Beiträge: 1783
Registriert: Samstag 16. April 2011, 12:47

Das Problem, das du beschreibst, kommt letztendlich dadurch zustande, dass in dem Code Darstellung, Programmlogik und Daten/Zustände sehr vermischt sind. Wenn du die einzelnen Entitäten sauber als Objekte mit Methoden modellierst, sollte sich das Problem erledigt haben. Voraussetzung ist, dass du dir, falls noch nicht geschehen, die Grundlagen der objektorientierten Programmierung in Python aneignest.
anonym106

Das hilft mir leider nicht weiter, wie ich die Variable verändere. Trotzdem vielen Dank für die Info, dass ich noch lernen muss. Das ist mir bewusst. Ich verstehe es nur nicht, da kann ich noch so viel lesen, deshalbe frage ich ja hier.
Benutzeravatar
__blackjack__
User
Beiträge: 14210
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Patsche: Das ist halt keine kurze Antwort a la „da musst Du in Zeile x folgendes ändern“, sondern das ganze Programm ist so wie es da steht ”falsch”. Da ist ein Sternchen-Import der nicht sein sollte, da ist alles mögliche auf Modulebene was da nicht hin gehört, da sind verschachtelte Funktionen die nicht verschachtelt sein sollten, und Programmlogik und GUI sind vermischt. Der Rat ist da halt sich mit objektorientierter Programmierung (OOP) vertraut machen, und das ganze noch mal neu schreiben.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
anonym106

Ok, danke. Könnte mich einer der Admins bitte aus dem Forum löschen? Scheinbar gibt es dafür keine Option für den Benutzer selbst. Danke.
Antworten