Меню параметров для цикла в Python Tkinter - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать меню параметров в цикле, и количество меню параметров зависит от переменной. Поэтому я пытаюсь использовать exec в своем коде.

Я использовал следующее для передачи значения 'i', чтобы подключиться к какой переменной изменяется значение.

Но как только я вызываю трассировку, опция, которую я выбираю в меню параметров, не обновляется в окне меню параметров. Если я не вызываю функцию трассировки, она обновляется на дисплее.

trackProcessMenu - это функция обратного вызова.

Пожалуйста, дайте мне знать, где я совершаю ошибку.

Добавление моего кода:

for i in range(0,numOfLibFiles):
            exec('self.processOptionMenuVar_%d = StringVar()'%i)
            process_menu = ("ff","ss","tt","fff","sss","ttt")
            exec('self.processOptionMenu_%d = OptionMenu(self, self.processOptionMenuVar_%d, *process_menu )'%(i,i))
            exec('self.processOptionMenu_%d.config(indicatoron=0,compound=RIGHT,image= self.downArrowImage, anchor = CENTER , direction = RIGHT)'%i)
            exec('self.processOptionMenuVar_%d.set("--")'%i)
            exec('self.processOptionMenu_%d.grid(row = i, column =1, sticky = N ,padx=30, pady =7 )'%i)

def trackProcessMenu(self,*args):    
    i = args[0]
    exec('process = self.processOptionMenuVar_%d.get()'%i)

1 Ответ

0 голосов
/ 04 сентября 2018

Вы не должны использовать exec таким образом. Хорошее практическое правило заключается в том, что вы никогда не должны использовать exec, пока не сможете ответить на вопрос "почему я никогда не должен использовать exec?" :-) exec имеет свои применения, но это не одно из них.

Вместо того, чтобы пытаться автоматически генерировать имена переменных, держите ваши виджеты в списке или словаре.

Например:

option_vars = []
option_menus = []

for i in range(0,numOfLibFiles):
    process_menu = ("ff","ss","tt","fff","sss","ttt")
    var = StringVar()
    om = OptionMenu(self, var, *process_menu)
    om.config(indicatoron=0,compound=RIGHT,image= self.downArrowImage, anchor = CENTER , direction = RIGHT)
    var.set("--")
    om.grid(row = i, column =1, sticky = N ,padx=30, pady =7)

    option_vars.append(var)
    option_menus.append(om)

Теперь вы можете ссылаться на переменные и меню с помощью простого индекса:

print("option 1 value is:", option_vars[1].get())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...