条目只接受浮动8,2

问题描述 投票:-6回答:1

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

python tkinter tkinter-entry
1个回答
1
投票

Entry有选项validate=validatecommand=你可以在Interactively validating Entry widget content in tkinter看到

还有A Validating Entry Widget

但您也可以将事件<KeyRelease>绑定到执行函数,您可以使用它来检查Entry中的值。

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

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

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

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()

编辑:validate=的示例 - 基于上面第二个链接的示例。

功能check()大多没有变化。它只使用return True/False而不是打印消息。它会阻止无效值。

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()
© www.soinside.com 2019 - 2024. All rights reserved.