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

时间:2019-04-09 01:02:12

标签: python tkinter tkinter-entry

所以我想在循环内使用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])

1 个答案:

答案 0 :(得分:0)

通过创建另一个函数并在检查程序内部调用并将其传递给我来解决该问题

                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])))