정답은 validatecommand
위젯 의 속성을 사용하는 것입니다. 안타깝게도이 기능은 Tkinter 세계에서는 충분히 문서화되어 있지 않지만 Tk 세계에서는 충분히 문서화되어 있습니다. 잘 문서화되어 있지는 않지만 바인딩이나 추적 변수에 의존하지 않고 유효성 검사 절차 내에서 위젯을 수정하지 않고도 유효성 검사를 수행하는 데 필요한 모든 것이 있습니다.
트릭은 Tkinter가 특정 값을 validate 명령에 전달할 수 있다는 것을 아는 것입니다. 이러한 값은 데이터가 유효한지 여부를 결정하는 데 필요한 모든 정보를 제공합니다. 편집 전 값, 편집이 유효한 경우 편집 후 값 및 기타 여러 정보를 제공합니다. 그러나이를 사용하려면이 정보를 validate 명령에 전달하기 위해 약간의 부두를해야합니다.
참고 : 유효성 검사 명령이 True
또는을 반환하는 것이 중요합니다 False
. 그 밖의 사항은 위젯에 대한 유효성 검사를 해제합니다.
다음은 소문자 만 허용하고 모든 펑키 값을 인쇄하는 예입니다.
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
메서드 를 호출 할 때 내부에서 발생하는 작업에 대한 자세한 내용 은 입력 유효성 검사 tkinter를 참조하세요.