Python 3.x Python、TK输入字段验证

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

因此,我有几个输入字段,要求用户输入他们需要的数字

我创建了一个验证规则,以防止人们输入数字以外的任何内容,并且为了计算,我插入了一个默认值0

问题是,现在字段不允许在输入任何其他数字之前清除其中的数字,例如,如果字段中有“0”,则必须键入0123,然后删除0以获得123,如果要更改123,则只能删除2和3,您必须键入它,然后再次删除初始图形

有人知道为什么会这样吗

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子句。如果你仔细想想,这是有道理的;)哈哈哈,我有没有告诉过你我是个白痴?真的是智障人士,谢谢你,效果很好。我学到了足够的东西,在两周内完成了一个完整的程序,我想我一定跳过了一些基本知识:幸运的是,这似乎也不起作用:(我不知道为什么会发生这种情况。请参阅对我答案的评论;可能与条款的放置有关;)不幸的是,这似乎也不起作用:(我不知道为什么会发生这种情况。请参阅对我答案的评论;可能与该条款的放置有关;)