Так что я хочу использовать trace () внутри цикла. Проблема в том, что функция, вызываемая трассировкой, передает переменные с помощью i. В результате вызывается только последняя строка Var в списке, а не все.
Программа предназначена для создания списка записей и присвоения строкового значения каждой записи, а затем при каждом вводе записи .trace () используется для проверки необходимости проверки записи. например, [False, 20] False означает, что не имеет значения, являются ли они буквами или цифрами, а 20 является пределом символа
self.label_list = [["First Name:","E",[False, 20]], ["Age","E",[False, 20]], ["Do you have a mobile phone?: ","RB", ["Yes", "No"]], ["Mobile Phone:", "HE",[False, 20]]]
self.string_var_list = []
self.old_value_list = []
for i in range(len(self.label_list)):
self.string_var_list.append(StringVar())
self.old_value_list.append("")
self.entry_builder()
def entry_builder(self):
self.entry_list = []
rows = 0
current = 0
for i in range(len(self.label_list)):
if self.label_list[i][1] == "E":
self.entry_list.append(Entry(self.frame2, width=30, textvariable = self.string_var_list[i]))
self.entry_list[current].configure(command = self.checkgiver())
self.entry_list[current].grid(row=len(self.entry_list), column =1, padx=(60,10))
current += 1
def checkgiver(self):
local_list = []
print("good")
for i in range(len(self.label_list)):
if self.label_list[i][1] == "HE" or self.label_list[i][1] == "E":
print(self.label_list[i][2][1])
self.string_var_list[i].trace('w', lambda *args: self.check_name(self.string_var_list[i], len(self.string_var_list[i].get()),
self.label_list[i][2][0],self.label_list[i][2][1]))
def check_name(self, b, c, Type, Len):
if c > Len:
b.set(b.get()[:Len])