Получить значение нескольких CheckButtons с одинаковым именем переменной tkinter python

У меня есть функция, которая создает словарь в зависимости от файла, который пользователь ввел в качестве параметра.

А затем я создаю графический интерфейс, который создает столько CheckButtons, сколько элементов в словаре.

Вот мой код:

for element in self.listdiagram.dict_diagrams :
    self.diagramVar = IntVar()
    self.diagram = Checkbutton(self.window, text=element, variable=self.diagramVar, onvalue=1, offvalue=0)
    self.diagram.pack(side = BOTTOM)
self.validate = Button(self.window, text="Validate", command=self.validateCallBack, width=15, height=3)
self.validate.pack(side = BOTTOM)

Проблема в том, что я не могу получить доступ к состоянию определенной кнопки, так как у них одинаковое имя переменной.

И я не знаю, как я могу назвать их по-другому.

Я пытался создать имя переменной с именем элемента словаря с помощью setattr(self, element, 0) или exec, но это не сработало, потому что str(element) может быть очень длинным.

Как я могу это сделать ?

Спасибо за помощь.

Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
0
359
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Очень простым решением этой проблемы было бы использование списка и просто добавление каждого Checkbutton в список.

Например:

self.diagramVars = []

for element in self.listdiagram.dict_diagrams :
    diagramVar = IntVar()
    diagram = Checkbutton(self.window, text=element, variable=diagramVar, onvalue=1, offvalue=0)
    diagram.pack(side = BOTTOM)

    self.diagramVars.append(diagramVar)

self.validate = Button(self.window, text="Validate", command=self.validateCallBack, width=15, height=3)
self.validate.pack(side = BOTTOM)

Q: For the moment i just want to print the state of each checkbuttons when i push the validate button but my next step is for example if i have self.diagramVars = [1, 0, 0] so the first checkButton is checked and so i want to run another function with the name (or the text) of the checked checkButton in paramater i don't know if i'm clear ?

Я считаю, что этот цикл for, который создает словарь с element в качестве ключа, будет подходящим решением (если element можно использовать как вариант text=element, то его можно использовать в качестве ключа):

self.diagramVars = {}

for element in self.listdiagram.dict_diagrams :
    diagramVar = IntVar()
    diagram = Checkbutton(self.window, text=element, variable=diagramVar, onvalue=1, offvalue=0)
    diagram.pack(side = BOTTOM)

    self.diagramVars[element] = diagramVar

self.validate = Button(self.window, text="Validate", command=self.validateCallBack, width=15, height=3)
self.validate.pack(side = BOTTOM)

Когда вы создаете этот словарь, чтобы получить значение CheckButton, вы будете использовать строку diagramVars[element].get(), которая будет получать доступ к состоянию «в реальном времени» CheckButton

Большое спасибо ! Я пытаюсь вместо создания списка создать такой словарь: diagramVars= {self.diagramVar : element} или diagramVars= {element : self.diagramVar}, но в обоих случаях у меня ошибка.

Lucas 22.05.2019 15:24

Как вы ожидаете получить элемент CheckButton из этого словаря? Например, как вы хотите получить доступ к определенной кнопке проверки, потому что сейчас у меня нет полного контекста причины, по которой вам нужен словарь.

MatthewG 22.05.2019 15:28

На данный момент я просто хочу напечатать состояние каждой контрольной кнопки, когда я нажимаю validate button, но мой следующий шаг, например, если у меня есть self.diagramVars = [1, 0, 0], поэтому проверяется первая кнопка проверки, и поэтому я хочу запустить другую функцию с именем (или текст ) проверенной кнопки checkButton в параметре я не знаю, ясно ли мне?

Lucas 22.05.2019 15:32

Я отредактировал свой ответ и добавил решение, которое я считаю.

MatthewG 22.05.2019 15:40

Это решение спасибо! Проблема в том, что diagramVar каждой контрольной кнопки всегда равно 0, даже если контрольные кнопки отмечены или нет.

Lucas 22.05.2019 15:42

Подождите, извините, я запутался, я решил проблему, или все еще есть проблема "diagramVar каждой контрольной кнопки всегда равна 0, даже если контрольные кнопки отмечены или нет"

MatthewG 22.05.2019 15:44

Вы решаете проблему со словарем, но я вначале не заметил, что с вашим решением, даже если я отмечу какие-либо CheckButtons в списке (или в словаре), diagramVar все еще равно 0. Когда я печатаю словарь с отмеченными кнопками и не проверено, у меня есть это: {'[LAB] Logical System 2': 0, '[LAB] Logical System': 0} {'[LAB] Logical System 2': 0, '[LAB] Logical System': 0}

Lucas 22.05.2019 15:47

Оба примера кода здесь по-прежнему используют variable=self.diagramVar при создании Checkbutton, хотя это не та переменная, которая на самом деле добавляется в список или dict...

jasonharper 22.05.2019 15:55

@ Лукас diagramVar не должен быть int значением, хотя? это должен быть указатель на объект IntVar, и вы должны иметь возможность использовать метод .get() для получения значения checkButton

MatthewG 22.05.2019 15:55

@jasonharper ах, да, ты прав, я просто забыл удалить self. оттуда. Спасибо за пикап! исправил это сейчас

MatthewG 22.05.2019 15:57

@MatthewG Да, я уже сделал это self.diagramVars[element] = diagramVar.get(), чтобы проверить, проверено это или нет

Lucas 22.05.2019 15:59

@ Лукас Нет, в этом проблема, когда вы делаете это, вы устанавливаете self.diagramVars[element] значение int, когда создается CheckButton, в основном вы делаете это self.diagramVars[element] = 0, потому что начальное значение dragramVars равно 0

MatthewG 22.05.2019 16:00

@ Лукас, вы хотите сделать это self.diagramVars[element] = diagramVar, а затем, когда вы хотите получить значение флажка, вы делаете это self.diagramVars[element].get(), и это даст вам текущее состояние флажка

MatthewG 22.05.2019 16:01

@MatthewG хм, так что я не понимаю, как получить доступ к значению контрольной кнопки «в режиме реального времени», если я могу сказать, что

Lucas 22.05.2019 16:02

Использование self.diagramVars[element] = diagramVar для присвоения значения словаря и self.diagramVars[element].get() для извлечения значения словаря сделает его доступом к значению «в реальном времени».

MatthewG 22.05.2019 16:04

Хорошо, я понимаю ! Большое спасибо !

Lucas 22.05.2019 16:06

Другие вопросы по теме