入口验证与tkinter出错

时间:2014-01-04 13:55:22

标签: python-3.x validation tkinter tkinter-entry

我目前正在学习tkinter的基础知识,我正在构建一个小型,超级简单的程序来测试我对一些最基本的小部件的知识。

我在验证和输入时遇到问题,可能是因为我对此事缺乏了解......这提出了三个问题:

1 - 如何做在这里完成的工作:https://stackoverflow.com/a/4140988/2828287没有课程部分。只是在脚本运行时执行此操作。

2 - 这些自我是什么。和。自己在那里?哪些是因为那是一个类,哪些是因为验证方法本身?

3 - 我的代码出了什么问题?基于该说明>> http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html

from tkinter import *
from tkinter import ttk

# function that should take the '%d' replacer and only validate if the user didn't delete
def isOkay(self, why):
    if why == 0:
        return False
    else:
        return True

okay = entry.register(isOkay) # didn't understand why I had to do this, but did it anyway...
entry = ttk.Entry(mainframe, validate="key", validatecommand=(okay, '%d'))
# the mainframe above is a ttk.Frame that contains all the widgets, and is the only child of the usual root [ = Tk()]
entry.grid(column=1,row=10) # already have lots of stuff on upper rows

我得到的错误是这样的: “NameError:名称'条目'未定义” 我试图改变事物的顺序,但总是存在其中一个错误..它指向我执行.register()东西的行

- 已编辑的代码 - 这不会给我一个错误,但仍允许我删除...

def isOkay(why):
    if (why == 0):
        return False
    else:
        return True

okay = (**root**.register(isOkay), "%d")
entry = ttk.Entry(mainframe, validate="key", validatecommand=okay)
entry.grid(column=1,row=10)

(其中'root'部分写在** **之间,是否必须是根?或者它可以是要使用它的窗口小部件的任何父级?或者它必须是直接父级它? 例如,我有: root>>大型机>>条目。它必须是root用户,大型机还是两者都可以?)

1 个答案:

答案 0 :(得分:1)

self的所有用法都是由于使用了类。它们与验证完全无关。什么都没有。

这是一个不使用类的示例,没有描述验证函数的长注释:

import Tkinter as tk

def OnValidate(d, i, P, s, S, v, V, W):
    print "OnValidate:"
    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
    # only allow if the string is lowercase
    return (S.lower() == S)

root = tk.Tk()

vcmd = (root.register(OnValidate), 
        '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
entry = tk.Entry(root, validate="key", 
                      validatecommand=vcmd)
entry.pack()
root.mainloop()

注意:注册命令的目的是在底层tcl / tk引擎和python库之间建立一个桥梁。实质上,它创建了一个调用OnValidate函数的tcl命令,为其提供所提供的参数。这是必要的,因为tkinter无法为tk的输入验证功能提供合适的接口。如果您不想要所有花哨的变量(%d%i等),则无需执行此步骤。

错误NameError: name 'entry' is not defined是因为您在定义entry之前使用entry。使用类的一个好处是,它允许您在文件中进一步定义方法,而不是使用它们。通过使用过程样式,您必须在使用函数之前定义函数*。

*从技术上讲,总是必须在使用之前定义函数。在使用类的情况下,在创建类的实例之前,实际上并不使用类的方法。实际上直到非常接近文件末尾才创建实例,这样您就可以在使用之前定义代码。