【问题标题】:Python validate and validateommand issues with ttk entry widgetttk 条目小部件的 Python validate 和 validateommand 问题
【发布时间】:2013-04-08 10:27:56
【问题描述】:

我正在尝试限制输入到条目小部件中的数字,使其长度必须为 4 个整数,介于 0000 到 9999 之间,实际上是一个 4 位数的密码。这个类工作正常,但是,关于以 0 开头的数字有一个小问题。如果要输入数字 0000,那么它将只取值 0 而不是实际值 0000。有人可以帮我指出我的意思吗我做错了。

class ConstrainedEntry(ttk.Entry):
    def __init__(self, *args, **kwargs):
        ttk.Entry.__init__(self, *args, **kwargs)

        vcmd = (self.register(self.on_validate),"%P")
        self.configure(validate="key", validatecommand=vcmd)

    def disallow(self):
        self.bell()

    def on_validate(self, new_value):
        try:
            if new_value.strip() == "": return True
            value = int(new_value)
            if value < 0 or value > 9999:
                self.disallow()
                return False
        except ValueError:
            self.disallow()
            return False

        return True

谢谢

【问题讨论】:

    标签: class python-3.x tkinter int


    【解决方案1】:

    您正在将值转换为 int:

    value = int(new_value)
    

    如果你的最终目的是检查用户是否输入了四位数字,你也可以使用一个非常简单的正则表达式:

    import re
    
    def on_validate(self, new_value):
        m = re.match(r'^(\d{1,4})?$', new_value)
        if m is None:
            self.disallow()
            return False
        else:
            return True
    

    【讨论】:

    • 我不相信这适用于上面的类,我得到一个错误“模块”对象没有属性“匹配”
    • @user2207573 抱歉,打错了。函数名称为match
    • 我注意到,就在我们查看模块之前,但是,这种更改仍然会导致错误发生'File "C:\Python33\lib\tkinter_init_.py" ,第 2474 行,删除 self.tk.call(self._w, 'delete', first, last) _tkinter.TclError: expected boolean value but got "None"'
    • @user2207573 我刚刚意识到您正在使用“密钥”作为验证条件,我将更改我的答案以反映这一点。您得到的错误来自delete 方法,而不是来自on_validate
    • 是的,但是实现上述方法会从“条目”中删除所有功能我认为这是关键问题吗?
    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2021-12-21
    • 2023-02-23
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多