Python 通过Tk小部件/窗口路径名访问小部件

Python 通过Tk小部件/窗口路径名访问小部件,python,python-3.x,tkinter,widget,tk,Python,Python 3.x,Tkinter,Widget,Tk,我正在使用validatecommand动态观察和验证条目小部件的输入 validatecommand的标准用法可防止在观察到的输入小部件中输入无效字符。这不是我喜欢的行为,因此我使用validatecommand将条目小部件的字符串传递给另一个函数,并在任何情况下返回Truefloatstr\u to\u float使用名为preg的正则表达式验证字符串 如果正则表达式匹配输入有效,则一切正常,因此执行print('approved')。但是,如果用户输入了无效的输入,则正则表达式不匹配,pr

我正在使用
validatecommand
动态观察和验证条目小部件的输入

validatecommand
的标准用法可防止在观察到的输入小部件中输入无效字符。这不是我喜欢的行为,因此我使用
validatecommand
将条目小部件的字符串传递给另一个函数,并在任何情况下
返回True
floatstr\u to\u float
使用名为
preg
的正则表达式验证字符串

如果正则表达式匹配输入有效,则一切正常,因此执行
print('approved')
。但是,如果用户输入了无效的输入,则正则表达式不匹配,
print('not approved')
将被执行,并且相应的输入小部件应填充为红色(颜色更改尚未正确实现)

到目前为止,我所做的是使用
.config(bg=)
更改第一个条目小部件的背景,以检查我是否能够通过索引所有已创建条目小部件的列表来访问每个小部件

validatecommand
可以向执行的函数传递多个命令(例如输入/文本字符串和小部件/窗口路径名)。因此,获取对无效小部件的引用通常不是问题。但是,
validatecommand
传递的路径名似乎不是python可访问的。如何通过在包含(in)有效输入的小部件上执行
.config(bg=)
,从该路径名获取引用(例如唯一变量名),以更改背景

--MWE--

#/usr/bin/env蟒蛇3
#-*-编码:-*-
#代码改编自:
# http://stackoverflow.com/questions/4140437/python-tkinter-interactively-validating-entry-widget-content
将tkinter作为tk导入
进口稀土
类MyApp():
定义初始化(自):
self.root=tk.tk()
self.parameternames=[
('a','U'),('b','U'),('c','U'),('d','U'),('e','U'),
('f','U'),('g','U'),('h','U'),('i','U'),('j','U'),
('k','U'),('l','U'),('m','U'),('n','U'),('o','U'),
('p','U'),('q','U'),('r','U'),('s','U'),('t','U')]
self.vcmd=(self.root.register(self.OnValidate),'%P','%W')
self.create_widgets()
def创建_小部件(自):
self.entries=[]
对于枚举中的i(自身参数名称):
entry=tk.entry(self.root,validate=“all”,validatecommand=self.vcmd)
self.default_bg=entry.cget(“bg”)
entry.pack()
self.entries.append(条目)
self.root.mainloop()
def OnValidate(自身、P、W):
#%P=如果允许编辑,则该条目的值
#%W=小部件的tk名称(路径名)
打印(“OnValidate:”)
打印(“P='%s'”%P)
打印(“W='%s'%W)
self.floatstr_到_float(P,W)
#返回True以显示插入的字符,验证由'floatstr_to_float()'中的re完成
返回真值
def floatstr_至_float(自身、fs、W):
preg=re.compile(“^\s*(?P\d*)\s*[\,]?\s*(?P\d*)\s*$”)
m=预匹配(fs)
如果m:
打印(“已批准”)
intprt=m.group('int')
frcprt=m.group('dec')
f=0。if(intprt=''和frcpt='')else浮点(“%s.%s%”(intprt,frcpt))#还不需要
#当前:只是更改第一个条目小部件的颜色(概念验证)
#目标:将编辑的条目小部件的唯一名称传递给self.change_bg()以更改
#适当的条目小部件
self.change_bg(self.entries[0],1)
其他:
打印('未批准')
#请参阅上面if语句中的注释
self.change_bg(self.entries[0],0)
def变更(自我、姓名、批准):
如果批准==1:
name.config(bg=self.default\u bg)
其他:
name.config(bg='#d9534f')
app=MyApp()

您可以使用
Tk
nametowidget
方法。这将根据其名称查找小部件。因此,请使用:

self.change_bg(self.root.nametowidget(W), 1)
self.change_bg(self.root.nametowidget(W), 1)