maximale Zeichenlänge in entry

Fragen zu Tkinter.
Antworten
Bueroklammer_xy
User
Beiträge: 2
Registriert: Samstag 5. Mai 2018, 11:18

Samstag 5. Mai 2018, 11:59

Hallo,

habe python zu meinem neuen Hobby gemacht und bewege mich auf Anfängerniveau.

Mein Problem:

Ich benutze tkinter (mit dem Modul ttk) und möchte in einem Entry-Feld die maximale Zeichenlänge auf 4 begrenzen. Leider habe ich keine Option für das Feld Entry finden können, in der man direkt die Zeichenlänge begrenzen kann. Ich habe es deswegen mit den Optionen validate und validatecommand versucht:

Code: Alles auswählen

def pruefung2():
    if len(zeiteingabe.get()) > 4:
        zeiteingabe.delete(4)
    
def pruefung(): 
    z = Timer(0.00001, pruefung2)
    z.start() 
    return True  

(...)
zeiteingabe = ttk.Entry(mainframe, width=7, textvariable=zeitwert, validate="key", validatecommand=pruefung)
Das Problem, das ich hierbei hatte war, dass die Funktion "pruefung" aufgerufen wurde, offenbar noch bevor das neu getippte Zeichen in "zeiteingabe" hinterlegt war. Deswegen wurde immer erst noch ein 5tes Zeichen im Textfeld hinzugefügt, bevor mit dem nächsten Tastendruck die Zeichen im Eingabefeld nach der 4ten Stelle gelöscht wurden. Irgendwann bin ich auf die Idee gekommen es mit einem Timer zu versuchen und tatsächlich klappt es so, dass nur 4 Zeichen geschrieben werden können. Also dass die Funktion "pruefung" erst aufgerufen wird, nachdem die neue Eingabe in "zeiteingabe" hinterlegt wurde...

Das klingt jetzt vielleicht nach Luxusproblem, denn immerhin funktioniert der Code. Aber es kommt mir recht unelegant vor und ich könnte mir vorstellen, dass es da eine bessere Lösung gibt.

Vielleicht weiß da jemand was?

Grüße von der Büroklammer_xy
__deets__
User
Beiträge: 2981
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 5. Mai 2018, 13:32

Steht alles in der Doku unter "Table 18. Callback substitution codes": http://infohost.nmt.edu/tcc/help/pubs/t ... ation.html

Du bekommst da schon den neuen Text, und kannst das AFAIK auch einfach ablehnen.
bfm
User
Beiträge: 74
Registriert: Donnerstag 14. März 2013, 09:42

Samstag 5. Mai 2018, 17:21

Hallo,

ich habe mir für dieses Problem eine kleine "Toolbox" geschrieben, in der ich eine von TKentry abgeleitete Klasse erstelle, die die Funktionen bietet, die ich gerne hätte. Begrenzung der Länge, Prüfung der eingegeben Zeichen und Werte, Auto-Tab wenn eine bestimmte Anzahl von Zeichen erreicht wurde, Keypad-Enter als Tab und und und. Von der Basisklasse kann man sich dann verschiedene Klassen für z. B. Datum, Uhrzeit, Dezimalen usw. ableiten.

Mit Tkinter muss man halt leider vieles selber nachbauen, was Qt & Co schon out-of-the-box dabei haben. Aber man hat halt nicht überall die Möglichkeit Qt & Co zu installieren.
Bueroklammer_xy
User
Beiträge: 2
Registriert: Samstag 5. Mai 2018, 11:18

Samstag 5. Mai 2018, 17:51

Keine Ahnung inwieweit das "sauber" ist, aber immerhin gefällt es mir besser als die Timer-Lösung:

Code: Alles auswählen

def pruefung3(eingabe):
    if len(eingabe) > 4:
        return False
    else:
        return True 

root = Tk()

(...)
okayCommand = root.register(pruefung3)
zeiteingabe = ttk.Entry(mainframe, width=7, textvariable=zeitwert, validate="key", validatecommand=(okayCommand, "%P"))
Danke für die Rückmeldungen.
Antworten