Tkinter - validatecommand + backspace

时间:2016-12-06 16:40:53

标签: tkinter backspace tkinter-entry

我正在尝试创建一个限制为16个字符的条目。 到目前为止,我有这样的事情:

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个之后输入任何其他字符。但是,它还可以防止通过退格键删除字符,我无法弄清楚如何...没有它这样做。
有谁知道我怎么解决这个问题?

编辑:具体来说,我需要能够找出按下的最后一个按钮是否退格

1 个答案:

答案 0 :(得分: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