每次在check_value
窗口小部件中输入的值发生更改时,我都想调用Entry
函数,但它只是第一次调用。
class table(tk.frame)
....
....#some functions
def enterdata(self):
....
....
for i in range(1,no_of_params):
cell=work_sheet.cell(i,0)
table.param_l.append(cell.value)
var=StringVar()
Button(middleframe,text=cell.value,width=40,height=2,command=lambda i=i :self.info(i)).grid(row=i+3,column=0)
entry=Entry(middleframe,validate='focusout',validatecommand=lambda i=i:self.checkvalue(middleframe,i-1),\
textvariable=var,bd=5,width=30).grid(row=i+3,column=1)
table.val.append(var)
Label(middleframe,text="Enter value",width=15,height=2,bd=5).grid(row=i+3,column=2)
def checkvalue(self,middleframe,r):
if r==0:
print table.val[r].get()
if "2" in table.val[r].get():
Label(middleframe,text="SUCCESS",fg="Dark Green",width=15,height=2,bd=5,\
font("Helvetica",11,"bold")).grid(row=r+4,column=2)
else:
Label(middleframe,text="ERROR",fg="Dark Red",width=15,height=2,bd=5,\
font=("Helvetica",11,"bold")).grid(row=r+4,column=2)
......#similar checks for other values of 'r'
答案 0 :(得分:1)
函数必须返回True
或False
。如果没有,则自动关闭验证。此外,您无法在该过程中更改条目窗口小部件的值。你没有显示你的整个代码,所以我不知道你是不是在做什么。
此外,同时使用validatecommand
和textvariable
时需要注意。只要您只使用var
获取值而从不设置它就可以了。
从the official tk documentation(构建Tkinter):
通常,textVariable和validateCommand可能很危险 混合。已经克服了任何问题,以便使用validateCommand 不会干扰条目小部件的传统行为。 将textVariable用于只读目的永远不会导致 问题。当您尝试将textVariable设置为时,会出现危险 validateCommand不接受的东西,导致 validate成为none(不会触发invalidCommand)。 当评估validateCommand发生错误时也会发生同样的情况。
主要是,在validateCommand或。时会发生错误 invalidCommand在评估时遇到错误 validateCommand不返回有效的Tcl布尔值。该 编辑条目时,validate选项也会将自身设置为none 来自validateCommand或invalidCommand的小部件。 此类版本将覆盖正在验证的版本。如果你 希望在编辑期间编辑条目小部件(例如将其设置为{}) 验证并仍然设置验证选项,您应该包括 命令