Tkinter - 验证命令 + 退格键

Tkinter - validatecommand + backspace

我正在尝试创建一个限制为 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()对Entry中的数字进行计算,并显示在另一个Label中

它工作正常,并防止在第 16 个字符之后输入任何其他字符。但是,它还可以防止通过退格键删除字符,而且我无法弄清楚如何......不让它这样做。
有谁知道我该如何解决这个问题?

编辑:具体来说,我需要能够查明最后按下的按钮是否是退格键

您可以让 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

有关详细信息,请参阅此答案: