Python 调用分配给StringVar()的函数时,如何在循环内保持i?

Python 调用分配给StringVar()的函数时,如何在循环内保持i?,python,tkinter,tkinter-entry,Python,Tkinter,Tkinter Entry,所以我想在循环中使用trace()。问题是跟踪调用的函数使用i传递变量。它只会导致调用列表中最后一个字符串Var,而不是all 该程序要做的是创建一个条目列表,并为每个条目分配一个字符串值,然后每当您键入条目时,都会使用trace()检查条目是否应被验证。False表示字母或数字不重要,20是字符限制 self.label_list = [["First Name:","E",[False, 20]], ["Age","E",[False, 20]], ["Do you have

所以我想在循环中使用trace()。问题是跟踪调用的函数使用i传递变量。它只会导致调用列表中最后一个字符串Var,而不是all

该程序要做的是创建一个条目列表,并为每个条目分配一个字符串值,然后每当您键入条目时,都会使用trace()检查条目是否应被验证。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])

通过创建另一个函数并在checkgiver中调用它并将i传递给它,解决了这个问题

                self.anotherfunc(i)

    def anotherfunc(self,i):
        self.trace_list.append(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])))