Vergleichen

Fragen zu Tkinter.
Antworten
Iwan_73
User
Beiträge: 3
Registriert: Dienstag 21. Juli 2020, 19:27

Hallo Zusammen,
ich bin ein weiterer Neuling, der in einem GUI Projekt einen noch zu geringen Wissensstand hat...... :roll:

Das Programm gibt im oberen Feld einen zufälligen Buchstaben aus und im unteren Feld kann man diesen dann eingeben und mit dem Kontrollbutton bestätigen, ob die Eingebe richtig oder falsch ist.... es zeigt immer falsch an auch wenn es richtig ist.

der Zweck des Programms ist die Tastatur kennen zu lernen.

Würde mich über ein paar Gedankenanstösse freuen.

Code: Alles auswählen

import tkinter

import random

def buchstabe():
    buchstabe = liste [random.randint(0, len(liste)-1)]
   
    ausgabe["text"] = buchstabe

    
def kontrolle():
    eingabe = eingabe_widget.get()
    if  eingabe == buchstabe:
        kontrolle_ausgabe["text"] = "Richtig"
    else:
        kontrolle_ausgabe["text"] = "Falsch"
    
  

liste = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
         "P","Q","R","S","T","U","V","W","X","Y","Z"]

   

main = tkinter.Tk()



hauptfenster = tkinter.Label(main, text = "Finde den Buchstaben auf der Tastatur!")
hauptfenster.pack()

startbutton = tkinter.Button(main, text = "Start", command = buchstabe)
startbutton.pack()



ausgabe = tkinter.Label(main)
ausgabe["font"] = "Arial 40"
ausgabe["height"] = 1
ausgabe["width"] = 2
ausgabe["borderwidth"] = 3
ausgabe["relief"] = "ridge"

ausgabe.pack()

eingabe_widget = tkinter.Entry(main, show = "")
eingabe_widget["font"] = "Arial 40"
eingabe_widget["width"] = 2
eingabe_widget["borderwidth"] = 3
eingabe_widget["relief"] = "ridge"

eingabe_widget.pack()

kontrolle_button = tkinter.Button(main, text = "Kontrolle", command = kontrolle)
kontrolle_button.pack()

kontrolle_ausgabe = tkinter.Label(main)
kontrolle_ausgabe.pack()


main.mainloop()




Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Die Variable "buchstabe" die du mit der eingabe vergleichst ist nicht das was du denkst was es ist. Beschäftige dich mit der Gültigkeit von Namensräumen und wie man Parameter an eine Funktion übergibt und wie man ein Ergebnis per return zurückliefert.

Die Zeile ist hier ist auch etwas umständlich:

Code: Alles auswählen

buchstabe = liste [random.randint(0, len(liste)-1)]
ein einfaches random.choice(name_der_liste) liefert dir ein zufälliges Element aus der Liste.

Funktionsnamen sollten aussagen was Sie machen, also statt "kontrolle" z.B. "kontrolliere_eingabe"
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jankie: nur dass hier ein Rückgabewert wenig hilft, da es sich um einen Callback handelt.

@Iwan_73: das Problem mit GUIs ist, dass sie schon sehr viel Wissen erfordern, um saubere Programme zu schreiben. Jedes nicht-triviale GUI-Programm braucht zwingend Klassendefinitionen, um sich Zustand über den Aufruf eines Callbacks hinaus zu merken. Und Zustand ist bei Dir der ausgewürfelte Buchstabe.

Gut Variablennamen sind wichtig. Sie sollten etwas über die Bedeutung der Variable sagen. liste ist nicht einfach eine Liste, sondern das sind buchstaben. ausgabe ist nicht irgendeine ausgabe, sondern der gerade gewürfelte Buchstabe. hauptfenster ist kein Hauptfenster, sondern einfach nur ein Label, das hier nichteinmal eine Variable braucht.

Code: Alles auswählen

import tkinter as tk
import random


BUCHSTABEN = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
         "P","Q","R","S","T","U","V","W","X","Y","Z"]

class MainWindow:
    def __init__(self):
        self.buchstabe = None
        self.main = tk.Tk()
        tk.Label(self.main, text="Finde den Buchstaben auf der Tastatur!").pack()
        tk.Button(self.main, text="Start", command=self.starte).pack()
        self.gesucht = tk.Label(self.main, font="Arial 40", height=1, width=2, borderwidth=3, relief="ridge")
        self.gesucht.pack()
        self.eingabe = tk.Entry(self.main, font="Arial 40", width=2, borderwidth=3, relief="ridge")
        self.eingabe.pack()
        tk.Button(self.main, text="Kontrolle", command=self.kontrolle).pack()
        self.ergebnis = tk.Label(self.main)
        self.ergebnis.pack()
        
    def starte(self):
        self.buchstabe = random.choice(BUCHSTABEN)
        self.gesucht["text"] = self.buchstabe

    def kontrolle(self):
        eingabe = self.eingabe.get()
        if eingabe.upper() == self.buchstabe:
            self.ergebnis["text"] = "Richtig"
        else:
            self.ergebnis["text"] = "Falsch"


def main():
    mainwindow = MainWindow()
    mainwindow.main.mainloop()
    
if __name__ == '__main__':
    main()
Iwan_73
User
Beiträge: 3
Registriert: Dienstag 21. Juli 2020, 19:27

Herzlichen Dank für die raschen Antworten und den umgeschriebenen Code :D .

gibt es eigentlich ein Tkinter Buch auf Deutsch? in der Python Lektüre die ich Besitze wird die GUI Programmierung zu wenig Tiefgründig behandelt, so das man sich schnell mal an ein zu anspruchsvolles Projekt heranmacht. (So wie ich jetzt)

Werde mich in der nächsten Zeit sicher wieder mit den Klassen und den Funktionen auseinandersetzen.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Iwan_73
Mit einem Buch kann ich nicht dienen, aber schau mal hier:
https://www.python-kurs.eu/python_tkinter.php
und mein Favorit, leider in englisch, gibts auch als pdf.
https://anzeljg.github.io/rin2/book2/24 ... index.html
Gruss
Peter
Iwan_73
User
Beiträge: 3
Registriert: Dienstag 21. Juli 2020, 19:27

@peterpy
Danke für die Links!
Antworten