首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tkinter - validatecommand + backspace

Tkinter - validatecommand + backspace
EN

Stack Overflow用户
提问于 2016-12-06 16:40:52
回答 1查看 1K关注 0票数 0

我试着做一个限制为16个字符的条目。到目前为止,我有这样的事情:

代码语言:javascript
运行
复制
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次。然而,它也防止字符被移除,而且我不知道如何.不是让它那样做的。

有人知道我怎么解决这个问题吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 17:32:06

您可以让validatecommand传入信息,这样您就不必检测到任何密钥。例如,如果允许编辑,您可以告诉它传入小部件中的值。您可以对照所需的长度检查该值,而不必知道用户是在添加或删除字符,还是键入字符或粘贴字符。

要做到这一点,首先要注册命令,以及要传递给命令的参数。例如:

代码语言:javascript
运行
复制
vcmd = (rt.register(tr_input), '%d', '%P', '%s')

然后将这个vcmd传递给validatecommand选项:

代码语言:javascript
运行
复制
e = { "textbox":tk.Entry(rt,validate = "all",validatecommand=vcmd) }

最后,修改tr_input函数以接受以下参数:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41000469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档