Tkinter验证是否必须严厉?

时间:2012-12-27 13:32:07

标签: python tkinter

我正在为Python / Tkinter应用程序设计一个“设置”框架,让用户可以指定IP地址,端口号和其他几个可配置选项。我想在让用户关闭框架之前验证用户条目。

根据我在Entry窗口小部件的validatevalidatecommand选项中读到(并尝试过)的内容,他们提供的唯一选择是“严厉”验证。阻止用户离开Entry小部件(甚至键入任何其他按键)直到条目有效的类型。这正是我在设计GUI时避免的行为,因为它让用户感到烦恼。

我打算切换到使用.trace方法来监视值,只是禁用“确定/应用”按钮,直到帧中的所有条目都有效。在我这样做之前,我想知道我是否遗漏了与内置验证选项有关的任何内容。我错过了一个不太沉重的选择吗?

3 个答案:

答案 0 :(得分:2)

您可以使用验证功能而无需“严厉”。在设置好/应用按钮的状态后,您的验证始终返回True。

答案 1 :(得分:1)

如果您使用跟踪,那么您可以拥有所需的内容而无需使用Tkinter的验证。使所有跟踪转到相同的功能,您可以根据需要测试和验证所有值,并根据启用或禁用确定按钮。

答案 2 :(得分:1)

我不确定你应该这样做,但是你可以附加一个invalidcommand处理程序,它将对条目起作用,好像一切正常。

示例脚本:

import Tkinter as tk

def onvalidate(d,i,P,s,S,v,V,W):
    # only lowercase is valid
    valid = (P.lower() == P)
    # set red background if invalid
    newcolor = 'red' if not valid else default_color
    root.nametowidget(W).configure(background=newcolor)
    return valid

def oninvalid(d,i,P,s,S,v,V,W):
    #called if widget is invalid
    widget = root.nametowidget(W)
    # S is the character that *would* have been
    # inserted or deleted, but won't because it is invalid
    # So we do it ourselves
    if S:
        if d=='0':
            widget.delete(i, len(S))
        elif d=='1':
            widget.insert(i, S)
    # Changing the text clears the 'validate' value
    # so we have to reset it
    widget.after_idle(lambda W,v: root.nametowidget(W).configure(validate=v), W, v)

root = tk.Tk()

valhook = (root.register(onvalidate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
invhook = (root.register(oninvalid), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

entry = tk.Entry(root, validate="key", validatecommand=valhook, invalidcommand=invhook)

default_color = entry.cget('background')

entry.pack()

root.mainloop()

如果没有,这将创建一个红色背景的条目,如果没有,则创建一个白色背景,但即使条目无效,仍会插入或删除文本。