Tkinter Textfeld auslesen

Fragen zu Tkinter.
Antworten
Nolram12345
User
Beiträge: 2
Registriert: Montag 4. September 2017, 15:57

Hi Leute !
Ich habe mal eine Frage zu Tkinter Entry Textfelden :
Ich sitze an einer Software , mit der man Verbindung mit einem Echo Server aufnehemen kann (unnützlich , ich weiß) .
Doch ich wollte nicht einfach die Python Console als Texteingabe nehmen , sondern ein Tkinter Textfeld mit Labes u.s.w.
Doch nun weiß ich nicht wie man ein Entry Textfeld ausliest .
Im Internet habe ich nichts gefunden .
Es wäre toll , wenn jemand mit helfen könnte !
Lg,Nolram
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Hier mal ein Beispiel mit Ein- und Ausgabe.
Doch völlig gleich wie Du das nun für Deine Zwecke schreibst, Du holst Dir den Inhalt von Entry mit get() und prüfst, ob etwas ausgefüllt wurde:

http://effbot.org/tkinterbook/entry.htm

Code: Alles auswählen

from tkinter import Tk, Entry, Button, Label, StringVar

class Eingabetest:

    def __init__(self):
        self.fenster = Tk()
        self.eingabe = None
        self.ausgabe = None
        self.labeltext = StringVar()
        
    def layout(self):
        self.fenster.title("Eingabetest")
        self.fenster.geometry("210x140")
        
        self.eingabe = Entry(self.fenster)
        self.eingabe.pack(pady = 10)
        Label(
            self.fenster,
            textvariable = self.labeltext
            ).pack(pady = 2)
        Button(
            self.fenster, 
            text = "Eingabe", 
            command = self.pruefe_eingabe
            ).pack(pady = 4)
        
    def pruefe_eingabe(self):
        self.ausgabe = self.eingabe.get()
        if self.ausgabe is not None and self.ausgabe != "":
            self.labeltext.set(self.ausgabe)

    def main(self):
        self.layout()
        self.fenster.mainloop()
        
if __name__ == "__main__":   
    Eingabetest().main()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Melewo: noch ein paar kleine Tipps am Rande. Ein StringVar-Objekt gibt mit get immer einen String zurück, None kann es da nicht geben. Zeile 29 läßt sich so oder so kürzer schreiben als "if self.ausgabe". »ausgabe« wird auch gar nicht als Attribut gebraucht. Zum einen ist es der selbe Wert wie »eingabe.get()«, zum anderen dient es nur lokal, um ein Label zu setzen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

So, dann noch einmal die nach den Tipps bereinigte Version, aus der etwas übersichtlicher hervorgeht, wie sich der Inhalt von Entry auslesen lässt. Wobei eine Prüfung in dieser Form eigentlich nur erforderlich wird, wenn es sich um irgendwelche Eingaben von anderen Benutzern handelt, die gegen ein Muster abgeglichen werden oder nicht leer bleiben sollten. Nur für den Eigenbedarf, da ist ja zu sehen, wenn nichts ausgeben wird oder man müsste in einem Else-Zweig auf auf einen leeren "" String reagieren, wie etwa "Keine Daten".

Code: Alles auswählen

from tkinter import Tk, Entry, Button, Label, StringVar

class Eingabetest:

    def __init__(self):
        self.fenster = Tk()
        self.eingabe = None
        self.labeltext = StringVar()

    def layout(self):
        self.fenster.title("Eingabetest")
        self.fenster.geometry("200x140")

        self.eingabe = Entry(self.fenster)
        self.eingabe.pack(pady = 10)
        Label(
            self.fenster,
            textvariable = self.labeltext
            ).pack(pady = 2)
        Button(
            self.fenster,
            text = "Eingabe",
            command = self.pruefe_eingabe
            ).pack(pady = 4)

    def pruefe_eingabe(self):
        ausgabe = self.eingabe.get()
        if ausgabe != "":
            self.labeltext.set(ausgabe)

    def main(self):
        self.layout()
        self.fenster.mainloop()

if __name__ == "__main__":
    Eingabetest().main()
Zuletzt geändert von Melewo am Dienstag 5. September 2017, 10:33, insgesamt 1-mal geändert.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Melewo: und jetzt noch der Feinschliff:

Code: Alles auswählen

if ausgabe:
    ...
in Zeile 28 reicht völlig. Denn ein leerer String wird im boolschen Kontext als False gewertet.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Gut, so geht es dann noch etwas kürzer mit dem if-Statement, wenn nichts folgt.

Code: Alles auswählen

    def pruefe_eingabe(self):
        ausgabe = self.eingabe.get()
        if ausgabe:
            self.labeltext.set(ausgabe)
        else:
            self.labeltext.set("Keine Daten!")
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch kompakter

Code: Alles auswählen

self.labeltext.set(self.eingabe.get() if self.eingabe.get() else "Keine Daten")
Ob man das so kompakt besser findet sei dahingestellt, aber mindestens mal die Code-Dopplung fuer das self.labeltext.get wuerde mich stoeren.

Code: Alles auswählen

    def pruefe_eingabe(self):
        ausgabe = self.eingabe.get()
        if not ausgabe:
            ausgabe = "Keine Daten!"
        self.labeltext.set(ausgabe)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Das ist sicherlich eine Variante, die ich mir merken sollte.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Als es noch keinen if-else-Operator gab beliebt, heute eher selten, hier aber doch recht lesbar:

Code: Alles auswählen

    def pruefe_eingabe(self):
        ausgabe = self.eingabe.get() or "Keine Daten!"
        self.labeltext.set(ausgabe)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Das kenne ich noch mit or, nur nicht im Zusammenhang mit Python, da wäre ich nicht auf die Idee gekommen, das so zu benutzen. Aber ein Autor von einem PHP-Buch benutzte das häufig, wenn sich z.B. eine Datei nicht mit fopen öffnen ließ, um mit or die("Fehlermeldung") auszugeben und die weitere Ausführung des Scripts abzubrechen, wobei er das "die()" als Alias für exit() benutzte.
Nolram12345
User
Beiträge: 2
Registriert: Montag 4. September 2017, 15:57

Vielen Dank für all diese Antworten !
Da hab ich ja erstmal was zu lesen !




Vielen Dank ,
Nolram12345
Antworten