Jak przekazać wartość do wpisu validatecommand
Sprawdzam formularz w tkinter przy użyciu validatecommand. Istnieją dwa wpisy, jeden powinien akceptować tylko liczby całkowite, a drugi zmiennoprzecinkowy.
Oto podstawowy kod:
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()
Zamiast pisać dwie różne funkcje dla dwóch bardzo podobnych zadań, próbowałem przekazać liczbę całkowitą do polecenia walidacji (1 dla liczby zmiennoprzecinkowej, 2 dla liczby całkowitej). Próbowałem użyć lambd do przekazywania wartości do funkcji walidacji, najpierw w części self.register: self.register(lambda: self.val1(1))ale to dało TypeError: <lambda>() takes 0 positional arguments but 1 was giveni za drugim razem próbowałem użyć lambdy w poleceniu validatecommand: validatecommand = lambda: validCmd1(1)co daje TypeError: 'tuple' object is not callable.
Czy można przekazać wartości do polecenia walidacji?
Odpowiedzi
Ta validatecommandopcja przyjmuje krotkę, która może zawierać dowolne argumenty. Na przykład, jeśli chcesz przekazać liczbę całkowitą, jest to takie proste:
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}'")
...
Czasami łatwiej jest zrozumieć, jeśli oddzielisz rejestrację polecenia od wartości przekazanej do validatecommand. Na przykład:
vcmd = self.register(self.val)
...
self.ent1 = tk.Entry(..., validatecommand = (vcmd, 1, "%P"))
self.ent2 = tk.Entry(..., validatecommand = (vcmd, 2, "%P"))