Python 3.x Python、TK输入字段验证
因此,我有几个输入字段,要求用户输入他们需要的数字 我创建了一个验证规则,以防止人们输入数字以外的任何内容,并且为了计算,我插入了一个默认值0 问题是,现在字段不允许在输入任何其他数字之前清除其中的数字,例如,如果字段中有“0”,则必须键入0123,然后删除0以获得123,如果要更改123,则只能删除2和3,您必须键入它,然后再次删除初始图形 有人知道为什么会这样吗Python 3.x Python、TK输入字段验证,python-3.x,tkinter,Python 3.x,Tkinter,因此,我有几个输入字段,要求用户输入他们需要的数字 我创建了一个验证规则,以防止人们输入数字以外的任何内容,并且为了计算,我插入了一个默认值0 问题是,现在字段不允许在输入任何其他数字之前清除其中的数字,例如,如果字段中有“0”,则必须键入0123,然后删除0以获得123,如果要更改123,则只能删除2和3,您必须键入它,然后再次删除初始图形 有人知道为什么会这样吗 vcmd = (root.register(self.validate), '%d', '%i', '%P
vcmd = (root.register(self.validate),
'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
def validate(self, action, index, value_if_allowed,
prior_value, text, validation_type, trigger_type, widget_name):
if text in '0123456789.-+*':
try:
float(value_if_allowed)
return True
except ValueError:
return False
else:
return False
我期待您的回复,我会在接下来的6个小时内定期刷新此页面,直到我得出结论
Lewis问题在于无法将空字符串转换为浮点 如果要清空条目,如果允许,则
值将引用“
”。这将通过if
比较,但在try
子句中失败
您可以在现有的if
子句中添加这样一个简单的测试:
if not value_if_allowed:
return True
顺便说一句,允许将“-+*”
作为字符串是没有意义的,因为它们也无法将转换为float。问题是不能将空字符串转换为float
如果要清空条目,如果允许,则值将引用“
”。这将通过if
比较,但在try
子句中失败
您可以在现有的if
子句中添加这样一个简单的测试:
if not value_if_allowed:
return True
顺便说一句,允许“-+*”
作为字符串是没有意义的,因为它们也无法转换为float。这是因为“
在python中不是有效的float
解决方案很简单:如果要允许空字符串,请测试空字符串,如果字符串为空,则返回True:
def validate(...):
if (value_if_allowed == ""):
return True
...
这是因为在python中,“
不是有效的浮点
解决方案很简单:如果要允许空字符串,请测试空字符串,如果字符串为空,则返回True:
def validate(...):
if (value_if_allowed == ""):
return True
...
谢谢你的建议,我删除了那些不必要的字符,在修改了If语句后,包括你的,不幸的是,我仍然有一个问题,在删除字段中的一个数字后,我不能让字段为空。你不应该有这个问题。你把if条款放在哪里了?Bryan的例子也在一个变体中包含了这一点。我是这样做的:-def validate(self、action、index、value_,如果允许的话)、prior_value、text、validation_type、trigger_type、widget_name):如果“0123456789*”中有文本:try:float(如果允许的话,value_)return True,ValueError除外:return False if not value\u if_allowed:return True else:return False是的,问题是您必须在所有其他内容之前插入这个if子句。如果你仔细想想,这是有道理的;)哈哈哈,我有没有告诉过你我是个白痴?真的是智障人士,谢谢你,效果很好。我学到了足够多的知识,可以在两周内完成一个完整的程序,我想我一定跳过了一些基本知识:感谢你的建议我在修改了If语句后删除了那些不必要的字符,包括你的,不幸的是,我仍然有一个持续的问题,在删除字段中的一个数字后,我不能让字段为空。你不应该有这个问题。你把if条款放在哪里了?Bryan的例子也在一个变体中包含了这一点。我是这样做的:-def validate(self、action、index、value_,如果允许的话)、prior_value、text、validation_type、trigger_type、widget_name):如果“0123456789*”中有文本:try:float(如果允许的话,value_)return True,ValueError除外:return False if not value\u if_allowed:return True else:return False是的,问题是您必须在所有其他内容之前插入这个if子句。如果你仔细想想,这是有道理的;)哈哈哈,我有没有告诉过你我是个白痴?真的是智障人士,谢谢你,效果很好。我学到了足够的东西,在两周内完成了一个完整的程序,我想我一定跳过了一些基本知识:幸运的是,这似乎也不起作用:(我不知道为什么会发生这种情况。请参阅对我答案的评论;可能与条款的放置有关;)不幸的是,这似乎也不起作用:(我不知道为什么会发生这种情况。请参阅对我答案的评论;可能与该条款的放置有关;)