1

我正在尝试使用 Python/tkInter 验证文本的输入

def validate_text():
    return False

text = Entry(textframe, validate="focusout", validatecommand=validate_text)

其中 validate_text 是函数-我尝试过总是返回 False 并且总是返回 True 并且结果没有区别..?我需要在函数中包含一组参数吗?

编辑 - 从 NONE 更改为 focusout ...仍然无法正常工作

4

4 回答 4

2

我认为您唯一缺少的是invalidcommand (or invcmd). 如果 validatecommand(或 vcmd)返回 false,您期望它做什么?根据 Tk 手册(见下文),如果 vcmd 返回 False 并且 validate设置为 none,则将调用 invcmd。invcmd 的典型命令是 Tkinter.bell,它会发出 ding 的声音。另请注意,vcmd 和 invcmd 非常敏感,如果它们遇到异常、如果小部件在 vcmd 或 invcmd 函数内以任何方式更改或者如果 vcmd 没有返回有效的 Tcl 布尔值,它们会将 validate 变为“none”。特别是 textvariable 因引起问题而臭名昭著,Entry 中名为 valdation 的部分专门处理了这个问题。

以下是 Tk 命令条目中的相关部分(与 Spinbox 相同)。有关更多参考,请参见下文。

命令行名称:-validatecommand or -vcmd
数据库名称:validateCommand
数据库类:ValidateCommand
指定要在您想要验证输入小部件的输入时评估的脚本。将其设置为 {} 会禁用此功能(默认设置)。该命令必须返回一个有效的 Tcl 布尔值。如果它返回 0(或有效的 Tcl 布尔等效值),则意味着您拒绝新版本并且它不会发生,并且如果设置了 invalidCommand 将被评估。如果它返回 1,则出现新版本。有关详细信息,请参阅下面的验证。

命令行名称:-invalidcommand or -invcmd
数据库名称:invalidCommand
数据库类:InvalidCommand
指定在 validateCommand 返回 0 时要评估的脚本。将其设置为 {} 将禁用此功能(默认设置)。此选项的最佳用途是将其设置为 bell。有关详细信息,请参阅下面的验证。

查看这个 SO 答案Tk 命令epydoc-Tkinter以获得更多参考。

这个问题有很多重复。 Python tkInter Entry fun
限制 Tkinter Entry 小部件中的值

于 2012-08-02T22:13:34.433 回答
2

您应该注册您的验证功能。

def validate_text():
    return False

textframe.register(validate_text)
text = Entry(textframe, validate="focusout", validatecommand=validate_text)
于 2018-06-12T05:10:07.740 回答
1

focusout意味着 validatecommand 将仅在您将焦点从 entrywidget 中取出时才会被调用。

您可以在键入时尝试“键”进行验证。

Tcl 手册:
通过将 validateCommand 选项设置为脚本来进行验证,该脚本将根据 validate 选项进行评估,如下所示:


  • 默认值。这意味着不会发生验证。

  • focus
    validateCommand 将在条目接收或失去焦点时调用。

  • focusin
    validateCommand 将在条目获得焦点时调用。

  • focusout
    validateCommand 将在条目失去焦点时调用。


  • 编辑条目时将调用key validateCommand。

  • 所有
    validateCommand 将针对上述所有条件调用。

于 2012-02-12T03:13:48.693 回答
0

“请注意,此选项 [validatecommand] 仅在 validate 选项不是 NONE 时使用”

来自http://effbot.org/tkinterbook/entry.htm#entry.Entry.config-method

于 2009-06-19T15:58:21.433 回答