Python Tkinter:将输入数据限制为浮动

Python Tkinter:将输入数据限制为浮动,python,tkinter,Python,Tkinter,我需要一个函数,可以将用户的输入检索为数值。 我一直在寻找答案,但我找到的答案不允许使用“-”、“+”和“,”(逗号)。 以下是验证方法的代码: def __init__(self, master1): self.panel2 = tk.Frame(master1) self.panel2.grid() vcmd = (master1.register(self.validate), '%d', '%i', '%P', '%s', '%S',

我需要一个函数,可以将用户的输入检索为数值。 我一直在寻找答案,但我找到的答案不允许使用“-”、“+”和“,”(逗号)。 以下是验证方法的代码:

   def __init__(self, master1):
    self.panel2 = tk.Frame(master1)
    self.panel2.grid()
    vcmd = (master1.register(self.validate),
            '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
    self.text1 = tk.Entry(self.panel2, validate = 'key', validatecommand = vcmd)
    self.text1.grid()
    self.text1.focus()



def validate(self, action, index, value_if_allowed,
    prior_value, text, validation_type, trigger_type, widget_name):
    # action=1 -> insert
    if(action=='1'):
        if text in '0123456789,-+':
            try:
                float(value_if_allowed)
                return True
            except ValueError:
                return False
        else:
            return False
    else:
        return True
同样,这似乎只适用于数字,但限制了逗号和加号和减号,这是无意的。
如何解决这个问题?

正确的工具无疑是模块

下面是一个正则表达式,可以完成此任务:

(\+|\-)?\d+(,\d+)?$
让我们把它分解一下:

(\+|\-)?\d+(,\d+)?$

 \+|\-                  Starts with a + or a -...
(     )?                ... but not necessarily
        \d+             Contains a repetition of at least one digits
            ,\d+        Is followed by a comma and at least one digits...
           (    )?      ... but not necessarily
                  $     Stops here: nothing follows the trailing digits
现在,如果输入与该正则表达式匹配,则
validate
函数只需返回
True
,如果输入与该正则表达式不匹配,则返回
False

def validate(string):
    result = re.match(r"(\+|\-)?\d+(,\d+)?$", string)
    return result is not None
一些测试:

# Valid inputs
>>> validate("123")
True
>>> validate("123,2")
True
>>> validate("+123,2")
True
>>> validate("-123,2")
True

# Invalid inputs
>>> validate("123,")
False
>>> validate("123,2,")
False
>>> validate("+123,2,")
False
>>> validate("hello")
False

编辑 我现在明白了,您希望实时检查输入是否有效。 下面是一个你可以做的例子:

import tkinter as tk
import re

def validate(string):
    regex = re.compile(r"(\+|\-)?[0-9,]*$")
    result = regex.match(string)
    return (string == ""
            or (string.count('+') <= 1
                and string.count('-') <= 1
                and string.count(',') <= 1
                and result is not None
                and result.group(0) != ""))
    
def on_validate(P):
    return validate(P)    
    
root = tk.Tk()
entry = tk.Entry(root, validate="key")
vcmd = (entry.register(on_validate), '%P')
entry.config(validatecommand=vcmd)
entry.pack()
root.mainloop()
将tkinter作为tk导入
进口稀土
def验证(字符串):
regex=re.compile(r“(\+\\-)?[0-9,]*$”)
结果=regex.match(字符串)
返回(字符串==“”

或(string.count(“+”)你做了什么来调试这个?我看到你有一个尝试/除了你忽略错误的地方。也许你应该打印出错误以便你理解它为什么拒绝你的字符。如果用户键入
5,
,这是允许的吗?@BryanOakley允许五个,但是逗号不会出现在GUI上的条目小部件上。This脚本没有打印错误。它所做的是,它不允许显示非数字字符以及逗号、+和-。我不太理解这个回答。你的问题意味着可以使用逗号。我希望允许使用逗号,但不允许。这就是问题所在。OP提到希望支持逗号,而你的代码是doesn不行。这似乎仍然不能满足用户的需求。他们试图在键入字符时验证字符(这个概念有缺陷,但这正是他们所要求的)。如果OP将您的函数插入到他们的代码中,它将阻止用户键入
123456
,因为它将阻止用户键入
123、
,他们必须在
123,45
123456
之前键入
123、
。您的答案需要说明一个事实,即您的代码不能在原始代码的上下文中使用。”alidate(string):result=re.match(r“(\+\\-)?\d+(,\d+)?$”,string)返回结果不是None root=Tk()v1\u 1=StringVar()userInput=Entry(root,textvariable=v1\u 1)userInput.bind('key',validate(v1\u 1))userInput.pack()'此脚本返回以下错误:TypeError:预期的字符串或类似字节的对象如何将输入转换为字符串或类似字节的对象?谢谢您的帮助。@AlBud我编辑了我的答案。这应该会产生您预期的结果。@BryanOakley我认为这应该与OP所寻找的类似。非常感谢您的指点消除我的误解;我今天学到了很多。另外,谢谢你关于条目验证的帖子-我在那里给你留下了一条评论,其中有一个我经常使用的文档,关于这个主题;你可能想把它作为参考,因为tkinter的文档有点罕见。