【问题标题】:Tkinter Focusout Entry ValidationTkinter Focusout 条目验证
【发布时间】:2013-08-26 19:24:09
【问题描述】:

我在这里看到了几个关于 tkinter 条目验证的问题,但每个问题似乎都坚持validate="key" 选项。

虽然这非常适合交互式验证,但我想要的是 "focusout" 验证。

更具体地说,我希望验证电子邮件字段。这是我到目前为止尝试过的代码,但它不起作用。

import Tkinter as tk
import re

master = tk.Tk()

def validateEmail(P):
    x = re.match(r"[^@]+@[^@]+\.[^@]+", P)
    return (x != None)

vcmd = (master.register(validateEmail), '%P')
emailentry = tk.Entry(master, validate="focusout", validatecommand=vcmd)
emailentry.pack()

b = tk.Button(master, text="Login")
b.pack()

tk.mainloop()

关于如何验证电子邮件条目的任何想法?

【问题讨论】:

    标签: python validation tkinter


    【解决方案1】:

    %S 表示要插入的字符串,如果有的话。这仅对文本插入的验证有意义。当小部件失去焦点时,不会插入任何字符,因此此参数将始终为空字符串。由于它是一个空字符串,它总是会导致您的验证失败。

    您应该改用%P,它代表整个字符串。

    另外,严格来说,验证函数应该返回一个布尔值而不是一个对象。您应该将匹配结果保存在变量中,然后返回类似return (match is not None)

    【讨论】:

    • 感谢我修改了相关代码以反映您的建议。现在它根据它是否是有效的电子邮件返回真或假。但是如果返回值为 false,它不应该突出显示或删除条目小部件中的文本吗?它对此没有任何作用。
    • 谢谢你知道了 - 需要定义 'invcmd' 来处理 False 返回
    • @QuakiGabbar:是的,如果它无效,您可能需要做一些额外的工作,例如强制焦点回到条目小部件,显示错误消息等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多