我有以下代码片段。
def validateEntries():
x1 = entry1.get()
if len(int(x1)) > 5:
return False
entry1 = Entry(window, validate='all', validatecommand=validateEntries)
你知道为什么这种情况不起作用吗?
出现以下错误:
invalid literal for int() with base 10:
目前,您正在验证Entry小部件发生的任何事情,包括单击它。因此,当您单击Entry时,它会调用validateEntries
。空条目的值为""
。无法将其转换为数字,因此会出现错误。相反,使用类似这样的验证命令:
def validateEntries(x1, action):
if action == "1": #Insertion
try:
int(x1) # Attempt to convert to an integer
except:
return False # If that fails, return False
else:
print(int(x1))
if int(x1) <= 5: # If it succeeds, try validation like before
return True
else:
return True # Allow backspace
return False # If no other value is returned, return False
window = Tk()
vcmd = (window.register(validateEntries), "%P", "%d")
entry1 = Entry(window, validate='key', validatecommand=vcmd)
许多代码都是基于这个答案的,这个答案很好地解释了验证命令。我已经更改了它,所以validate命令只在按键时调用,并创建了一个命令,该命令接受条目的值,即允许编辑和操作(插入/删除(,并将其传递给validateEntries。这在链接的答案中得到了更好的解释
验证本身已更改。如果条目的内容不是整数,则验证无效。现在,它使用try/except语句来检查它是否是整数,然后检查它的值。它还检查操作,并且只在插入时进行验证,因此使用退格不会被阻止。现在验证工作如预期。