Создание динамического числа функций и вызов команд в Tkinter - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть два отдельных столбца флажков в tkinter в python с одинаковыми метками.

Моя цель - отключить их в одном из столбцов, когда тот же элемент выбран в другом столбце.

Я могу сделать это вне классов и функций, но у меня возникают проблемы с вызовом переменных внутри функций.

Когда я подключаю статические значения для динамических параметров и удаляю цикл при создании командной функции, чтобы отключитькнопки, работает отлично.Однако всякий раз, когда я использую цикл, я получаю ответ «AttributeError: 'tool” не имеет атрибута «dsblr0» ».

Как получить доступ к функциям, созданным в цикле, чтобы я мог отключить блокиво втором столбце всякий раз, когда в первом столбце проверяются одинаковые элементы?

Любая помощь приветствуется!

Мой текущий код:

from tkinter import *
from tkinter import messagebox

buttonnames = []
class tool(Frame):
    def get_button_names(self):
        self.buttonnames=['b1','b2','b3','b4','b5']
        global buttonnames
        for item in self.buttonnames:
            buttonnames.append(item)

    def __init__(self, parent):
        '''
        Constructor
        '''
        Frame.__init__(self, parent)
        self.parent=parent
        self.get_button_names()
        self.display_new_window()

    for i in range(len(buttonnames)):
        exec('''def dsblr{0}(self):
    self.bcb{0}.config(state=DISABLED if self.var{0}.get() else NORMAL)'''.format(i,))

    def display_new_window(self):
        """ Transpose tools
        """
        self.parent.title("Tool")

        self.parent.grid_rowconfigure(0, weight=1)
        self.parent.grid_columnconfigure(0, weight=1)

        for i,column in enumerate(self.buttonnames):
            exec('self.var{0}=IntVar()'.format(i,))
            exec('self.bvar{0}=IntVar()'.format(i,))
            exec('self.cb{0} = Checkbutton(self.parent, text=column, variable=self.var{0},command=self.dsblr{0})'.format(i,))
            exec("self.cb{0}.grid(row=i+1,column=0,sticky='w')".format(i,))
            exec('self.bcb{0} = Checkbutton(self.parent, text=column, variable=self.bvar{0})'.format(i,))
            exec("self.bcb{0}.grid(row=i+1,column=1,sticky='w')".format(i,))

def main():
    root=Tk()
    d=tool(root)
    root.mainloop()

if __name__=="__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...