Hallo,
ich habe mir mal vor längerer Zeit eine von der ttk-Entry-Klasse abgeleitete eigene Klasse gebastelt. Es war mir zu nervig, immer wieder die gleichen Zeilen an Code zu kopieren, weil es Sachen gibt, die ich einfach in jedem Eingabefeld will. Enter/Return für Tab, maximale Anzahl Zeichen, Welche Zeichen dürfen eingegben werden? Prüfung Datum, Uhrzeit, Nummern, Dezimalen, Auto-Tab usw.
Von der Basis-Klasse leite ich mir dann andere Klassen für Datum, Uhrzeit, Nummern, Dezimale usw ab. Der Code ist zwar vielleicht nicht schön aber selten und tut was er soll. Heute würde ich vielleicht auch einiges anders machen. Man sammelt mit der Zeit seine Erfahrungen und außerdem ist noch kein Meister vom Himmel gefallen.
Hier ein Stück von dem Code: Die interessanten Stellen sind mit -> Kommentaren versehen
Code: Alles auswählen
class basic_entry(ttk.Entry):
def __init__(self, *args, **kwargs):
ttk.Entry.__init__(self, *args, **kwargs)
self.entry_value = tkinter.StringVar()
self.item_id = 'basic_entry'
self.item_type = 'basic_entry'
self.default_value = ''
self.is_checked = False
-> Command für Validation als Attribut, damit es jederzeit austauschbar ist
self.validatecmd = self.register(self.isOkay)
-> Config-Entry -> beim Drücken einer Taste wird die Validation ausgeführt
self.config(textvariable=self.entry_value, width=10, validate='key', \
validatecommand=(self.validatecmd, '%s', '%P', '%S', '%d'))
self.bind('<Return>', self.value_check_event)
self.bind('<KP_Enter>', self.value_check_event)
self.bind('<Tab>', self.tab_pressed)
self.bind('<KeyRelease>', self.check_auto_tab)
self.bind('<FocusIn>', self.focus_in)
#custom settings
self.valid_values = ''
-> diese Zeichen sollen zulässig sein
self.valid_content = '1234567890.,'
self.duplicate = False
self.empty_allowed = True
self.auto_tab = False
self.max_length = 0
self.justify_right = False
if self.justify_right:
self.config(justify='right')
self.uppercase = False
#print(self.configure())
#Eingaben prüfen
#True = Änderung erlaubt
#False = Änderung nicht erlaubt
-> Validation -> übergebene Werte sind: Wert in Entry vor der Änderung, Wert in Entry nach der Änderung (so würde der Wert aussehen, wenn die Änderung zulässig ist), Wert der Änderung selber, Grund
def isOkay(self, before, after, change, reason):
#Änderung des Inhalts is_checked = False
self.is_checked = False
#print('vorher: ', before, 'nachher: ', after, 'geaendert: ', change, 'Grund: ', reason)
#print(type(reason))
-> reason 1 = Änderung
if reason=='1':
#etwas eingefügt
#maximale Länge prüfen
if self.max_length > 0:
if len(after) > self.max_length:
return False
#gültiger Inhalt leer
if self.valid_content == '':
return True
#gültiger Inhalt prüfen
-> Prüfung von Parameter "change" (%S = Wert der Änderung), ob im Attribut self.valid_content (=String) enthalten ist
if change in self.valid_content:
return True
else:
return False
else:
#etwas gelöscht
return True