So übergeben Sie einen Wert an einen Eintrag validatecommand
Ich validiere ein Formular in tkinter mit validatecommand. Es gibt zwei Einträge, einer sollte nur ganze Zahlen akzeptieren und der andere schwebt.
Hier ist der Basiscode:
import tkinter as tk
class Form(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
validCmd1 = (self.register(self.val1), "%P")
validCmd2 = (self.register(self.val2), "%P")
self.lab1 = tk.Label(self, text = "Float:")
self.lab1.grid(row = 1, column = 0, padx = 10, pady = 10)
self.ent1 = tk.Entry(self, validate = "key", validatecommand = validCmd1)
self.ent1.grid(row = 1, column = 1)
self.lab2 = tk.Label(self, text = "Integer:")
self.lab2.grid(row = 2, column = 0, padx = 10, pady = (0,10))
self.ent2 = tk.Entry(self, validate = "key", validatecommand = validCmd2)
self.ent2.grid(row = 2, column = 1)
def val1(self, value):
try:
float(value)
except:
return False
else:
return True
def val2(self, value):
try:
int(value)
except:
return False
else:
return True
app = Form()
app.mainloop()
Anstatt zwei verschiedene Funktionen für zwei sehr ähnliche Aufgaben zu schreiben, habe ich versucht, eine Ganzzahl an den Validierungsbefehl zu übergeben (1 für float, 2 für integer). Ich habe versucht, Lambdas zu verwenden, um Werte an die Validierungsfunktionen zu übergeben, zuerst im Teil self.register: self.register(lambda: self.val1(1))aber dies gab TypeError: <lambda>() takes 0 positional arguments but 1 was givenund das zweite Mal habe ich versucht, Lambda im Befehl validatecommand zu verwenden: validatecommand = lambda: validCmd1(1)welche gibt TypeError: 'tuple' object is not callable.
Ist es möglich, Werte an einen Validierungsbefehl zu übergeben?
Antworten
Die validatecommandOption verwendet ein Tupel, das beliebige Argumente enthalten kann. Wenn Sie beispielsweise eine Ganzzahl übergeben möchten, ist dies so einfach:
validCmd1 = (self.register(self.val), 1, "%P")
validCmd2 = (self.register(self.val), 2, "%P")
def val(self, arg, value):
print(f"val1 arg='{arg}' value='{value}'")
...
Manchmal ist es einfacher zu verstehen, wenn Sie die Registrierung des Befehls von dem an übergebenen Wert trennen validatecommand. Zum Beispiel:
vcmd = self.register(self.val)
...
self.ent1 = tk.Entry(..., validatecommand = (vcmd, 1, "%P"))
self.ent2 = tk.Entry(..., validatecommand = (vcmd, 2, "%P"))