我目前正在学习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用户,大型机还是两者都可以?)
答案 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
。使用类的一个好处是,它允许您在文件中进一步定义方法,而不是使用它们。通过使用过程样式,您必须在使用函数之前定义函数*。
*从技术上讲,总是必须在使用之前定义函数。在使用类的情况下,在创建类的实例之前,实际上并不使用类的方法。实际上直到非常接近文件末尾才创建实例,这样您就可以在使用之前定义代码。