2016-12-06 5 views
0

16 문자로 제한하려고합니다. 은 지금까지 나는 이런 일이 :Tkinter - validatecommand + backspace

import tkinter as tk 

rt = tk.Tk() 

def tr_input(): 
    a = e['textbox'] 
    b = a.get() 
    print(b) 
    if "\b" in b: 
     return True 
    if "\n" in b: 
     calculate() 
    elif len(b)>16: 
     return False 
    return True 

e = { "textbox":tk.Entry(rt,validate = "all",validatecommand=tr_input) } 

calculate()이 항목의 숫자에 대한 계산을 수행하고, 다른 라벨에 표시를

그것은 잘 작동하고, 다음에 입력되는 것을 더 이상 문자를 방지 16 번째. 그러나 백 스페이스를 통해 문자가 제거되는 것을 방지하기 때문에 어떻게해야 할지를 알 수 없습니다.
누구든지이 문제를 해결할 수있는 방법을 알고 있습니까?

편집 : 특히, 나는 마지막으로 누른 버튼은 어떤 키를 감지 할 필요가 없도록 정보의 validatecommand 패스를 가질 수 백 스페이스

답변

0

이었다 여부를 확인 할 수 있어야합니다. 예를 들어, 편집이 허용되면 위젯에있는 값을 전달하도록 지정할 수 있습니다. 사용자가 문자를 추가하거나 제거하는지 또는 문자를 입력했는지 또는 붙여 넣었는지 여부를 알지 않고도 원하는 길이와 비교하여 값을 확인할 수 있습니다.

먼저 명령을 등록 할 인수와 함께 당신의 명령에 합격하십시오. 예를 들어 :

vcmd = (rt.register(tr_input), '%d', '%P', '%s') 

당신은 다음 validatecommand 옵션이 vcmd을 전달합니다

e = { "textbox":tk.Entry(rt,validate = "all",validatecommand=vcmd) } 

을 마지막으로, 이러한 인수 허용하도록 tr_input 기능을 수정 자세한 내용은이를 참조하십시오

def tr_input(d, P, s): 
    # d = type of action (1=insert, 0=delete, -1 all others) 
    # P = value of entry if edit is allowed 
    # s = value of entry prior to allowing the edit 
    print("tr_input: d='%s' P='%s' s='%s'" % (d,P,s)) 
    if len(P) > 16: 
     return False 
    return True 

을 답변 : https://stackoverflow.com/a/4140988/7432