Python 输入仅接受浮动8,2

Python 输入仅接受浮动8,2,python,tkinter,tkinter-entry,Python,Tkinter,Tkinter Entry,我需要使用tkinter python来定义一个输入字段,该字段只接受一个带有8个整数和2个小数的浮点字段,如果它不符合8.2格式,可能会显示一条错误消息。您可以帮助我定义此字段的格式。有选项validate=和validatecommand=,您可以在 还有 但您也可以绑定event以执行可用于检查条目中的值的函数 我使用点分割文本。如果我得到超过2个部分,那么就有超过2个点 然后我检查第二部分是否存在,是否为空,是否只有数字,是否不超过8个字符。类似于我检查第一部分的方式 当字符串无效时,我

我需要使用tkinter python来定义一个输入字段,该字段只接受一个带有8个整数和2个小数的浮点字段,如果它不符合8.2格式,可能会显示一条错误消息。您可以帮助我定义此字段的格式。

有选项
validate=
validatecommand=
,您可以在

还有

但您也可以绑定event
以执行可用于检查条目中的值的函数

我使用点分割文本。如果我得到超过2个部分,那么就有超过2个点

然后我检查第二部分是否存在,是否为空,是否只有数字,是否不超过8个字符。类似于我检查第一部分的方式

当字符串无效时,我只在控制台中打印消息,但您可以做更多的事情-您可以在
条目中显示messagebox或替换文本

import tkinter as tk

def check(event):
    text = event.widget.get()
    print('text:', text)

    parts = text.split('.')
    parts_number = len(parts)

    if parts_number > 2:
        print('too much dots')

    if parts_number > 1 and parts[1]: # don't check empty string
        if not parts[1].isdecimal() or len(parts[1]) > 2:
            print('wrong second part')

    if parts_number > 0 and parts[0]: # don't check empty string
        if not parts[0].isdecimal() or len(parts[0]) > 8:
            print('wrong first part')

root = tk.Tk()

e = tk.Entry(root)
e.pack()
e.bind('<KeyRelease>', check)

root.mainloop()

你的意思是8位和2位小数?你可以得到字符串,用点分割,然后检查两部分的长度和数字。欢迎使用堆栈溢出,请在发布前尝试搜索你的问题。有关tkinter中的基本验证,请参阅。这将为验证逻辑提供一个良好的起点。谢谢您的帮助,但这不是我想要的。实际上,必须能够插入一个仅限数字的字段,最多8个整数和2个小数。不得允许输入字母字符。实际上,如果在字段的出口处输入12352.45,其格式将为12.352,45。谢谢如果新字符不是数字,您可以随时替换条目中的文本。您还可以尝试使用
validatecommand=
来阻止某些键。但您必须手动检查字符串是否具有正确的格式-与我的示例类似,或者您可以尝试使用正则表达式检查格式。我添加了带有
validate=
的示例,感谢这正是我要查找的内容,您可以添加这样的内容:当您离开字段焦点时,使用数百个点更新值。例如:12345678,69 12.245.678,58谢谢如果我添加了数百分,那么它将与现有规则不匹配,并且以后编辑它会有问题-它将需要更多的工作。当您关注或更改所有规则时,您必须将其转换回没有点的版本。
import tkinter as tk

def check(d, i, P, s, S, v, V, W):
    #print("d='%s'" % d)
    #print("i='%s'" % i)
    #print("P='%s'" % P)
    #print("s='%s'" % s)
    #print("S='%s'" % S)
    #print("v='%s'" % v)
    #print("V='%s'" % V)
    #print("W='%s'" % W)    

    text = P  #e.get()
    print('text:', text)

    parts = text.split('.')
    parts_number = len(parts)

    if parts_number > 2:
        #print('too much dots')
        return False

    if parts_number > 1 and parts[1]: # don't check empty string
        if not parts[1].isdecimal() or len(parts[1]) > 2:
            #print('wrong second part')
            return False

    if parts_number > 0 and parts[0]: # don't check empty string
        if not parts[0].isdecimal() or len(parts[0]) > 8:
            #print('wrong first part')
            return False

    return True

# --- main ---

root = tk.Tk()

vcmd = (root.register(check), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

e = tk.Entry(root, validate='key', validatecommand=vcmd)
e.pack()

root.mainloop()