У меня есть два отдельных столбца флажков в 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()