2013-04-08 45 views
0

我想限制输入到条目小部件中的数字,以便它必须是4整数长,值0000到9999之间,有效地一个4位数的PIN号码。这个类可以正常工作,但是,对于以0开头的数字存在一个小问题。如果要输入0000,那么它只会取值0而不是实际值0000.有人可以帮我指出我做错了。Python验证和validateommand问题与ttk条目小部件

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 

感谢

回答

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 
+0

我不相信这将适用于上面的类,即时通讯错误“模块”对象没有属性“匹配” – user2207573 2013-04-08 11:23:11

+0

@ user2207573对不起,这是一个错字。函数的名字是['match'](http://docs.python.org/3.3/library/re.html#re.match) – 2013-04-08 11:26:10

+0

我注意到,就在我们看模块之前,这个改变仍然发生错误发生'文件'C:\ Python33 \ lib \ tkinter \ __ init__.py“,第2474行,删除 self.tk.call(self._w,'delete',first,last) _tkinter.TclError :预期的布尔值,但得到“无”' – user2207573 2013-04-08 11:31:17