【问题标题】:validatecommand in Tkinter—loop validating?Tkinter 中的 validatecommand——循环验证?
【发布时间】:2013-11-12 22:37:19
【问题描述】:

这是我目前所拥有的

vdcm = (self.register(self.checkForInt), '%S')
roundsNumTB = Entry(self, validate = 'key', validatecommand = vdcm)

那么checkForInt()函数就是这样定义的

def checkForInt(self, S):
        return (S.isDigit())

输入框是用来输入偶数的,而且只能是一个数字;不是字符。如果输入了一个字符,它就会被拒绝。这只会工作一次。如果输入了一个字符,下一个输入的按键不会被拒绝。

如果有人能告诉我如何让它永久检查以确保字符串是一个数字,并且是一个偶数,那将不胜感激。

如果有任何帮助,这是我收到的错误消息

Exception in Tkinter callback
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1470, in __call__
    return self.func(*args)
  File "[py directory]", line 101, in checkForInt
    return (S.isDigit())
AttributeError: 'str' object has no attribute 'isDigit'

【问题讨论】:

    标签: python tkinter tkinter-entry


    【解决方案1】:

    我认为函数调用是isdigit() 而不是isDigit(),注意大小写差异。如果您想测试输入是否为整数,甚至是整数,您必须首先使用int() 转换字符串并测试:

    def checkForEvenInt(self, S):
        if S.isdigit():
            if int(S) % 2 is 0:
                return True
        return False
    

    请记住,Python 非常区分大小写,包括函数。例如,这是一个 iPython 会话:

    In [1]: def my_func(): return True
    
    In [2]: my_func()
    Out[2]: True
    
    In [3]: my_Func()
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-25-ac6a0a3aba88> in <module>()
    ----> 1 my_Func()
    
    NameError: name 'my_Func' is not defined
    

    【讨论】:

    • 它之所以有效,是因为 Python 区分大小写并且isdigit()isDigit() 不同。我会用解释更新答案。
    • 这可以解释吗?还是您对模 (%) 运算符感到困惑?
    • 是的,我愿意。解释器只是 dohsdknd'd(''d' 使它成为动词或其他东西),因为我没有考虑到它是区分大小写的。
    • 太好了,很高兴为您提供帮助。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2012-10-09
    • 2021-06-05
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多