2016-12-06 15 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-й. Тем не менее, это также предотвращает удаление символов через backspace, и я не могу понять, как ... не делать этого.
Кто-нибудь знает, как я могу это исправить?

Edit: В частности, мне нужно, чтобы иметь возможность узнать, если последняя кнопка нажата была забой

ответ

0

Вы можете иметь validatecommand пропуск в информации, так что вы не должны обнаружить никаких ключей. Например, вы можете сказать ему передать значение, которое будет в виджетах, если разрешено редактирование. Вы можете проверить это значение на нужную длину, не зная, добавляет ли пользователь или удаляет символы, или они набирали символы или вставляли их.

Вы делаете это, сначала регистрируя свою команду, а также аргументы передаваться в вашу команду. Например:

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

Вы затем передать этот vcmd к опции validatecommand:

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