Doğru cevap, validatecommand
widget'ın özelliğini kullanmaktır . Ne yazık ki, bu özellik Tkinter dünyasında yeterince belgelenmemiştir, ancak Tk dünyasında yeterince belgelenmiştir. İyi bir şekilde belgelenmemiş olsa da, bağlamalara başvurmadan veya değişkenleri takip etmeden veya doğrulama prosedürünün içinden widget'ı değiştirmeden doğrulama yapmanız gereken her şeye sahiptir.
İşin püf noktası, Tkinter'in validate komutunuza özel değerler vermesini sağlayabileceğinizi bilmektir. Bu değerler size verilerin geçerli olup olmadığına karar vermeniz için bilmeniz gereken tüm bilgileri verir: düzenlemeden önceki değer, düzenleme geçerliyse düzenlemeden sonraki değer ve diğer birkaç bilgi biti. Bunları kullanmak için, bu bilgiyi validate komutunuza geçirmek için biraz voodoo yapmanız gerekir.
Not: doğrulama komutunun ya True
da döndürmesi önemlidir False
. Başka herhangi bir şey, widget için doğrulamanın kapatılmasına neden olur.
Aşağıda, yalnızca küçük harfe izin veren (ve tüm bu ilginç değerleri yazdıran) bir örnek verilmiştir:
import tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
vcmd = (self.register(self.onValidate),
'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
self.entry = tk.Entry(self, validate="key", validatecommand=vcmd)
self.text = tk.Text(self, height=10, width=40)
self.entry.pack(side="top", fill="x")
self.text.pack(side="bottom", fill="both", expand=True)
def onValidate(self, d, i, P, s, S, v, V, W):
self.text.delete("1.0", "end")
self.text.insert("end","OnValidate:\n")
self.text.insert("end","d='%s'\n" % d)
self.text.insert("end","i='%s'\n" % i)
self.text.insert("end","P='%s'\n" % P)
self.text.insert("end","s='%s'\n" % s)
self.text.insert("end","S='%s'\n" % S)
self.text.insert("end","v='%s'\n" % v)
self.text.insert("end","V='%s'\n" % V)
self.text.insert("end","W='%s'\n" % W)
if S == S.lower():
return True
else:
self.bell()
return False
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
register
Yöntemi çağırdığınızda başlık altında neler olduğu hakkında daha fazla bilgi için bkz. Giriş doğrulama tkinter