2016-12-06 17 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

関連する問題