Как сохранить I при вызове функции, назначенной для трассировки StringVar (). Внутри цикла? - PullRequest
2 голосов
/ 09 апреля 2019

Так что я хочу использовать 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 голосов
/ 09 апреля 2019

решил это, создав другую функцию и вызвав ее внутри средства проверки и передав ей 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])))

...