Как ограничить пользователя одной контрольной кнопкой, проверенной tkinter python

Я создал графический интерфейс с несколькими контрольными кнопками (количество контрольных кнопок случайное, оно зависит от файла, который пользователь ранее ввел в качестве параметра).

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

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

for element in self.listdiagram.dict_diagrams:
    diagramVar = IntVar()
    diagram = Radiobutton(self.window, text=element, variable=diagramVar, value=1)
    diagram.pack(side=BOTTOM, expand=1)

    self.diagramVars[self.listdiagram.dict_diagrams.get(element)] = diagramVar

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

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

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

Обновлено: вот как это выглядит, значение в порядке, но оба отмечены, и я не могу снять их, хотя радиокнопки были, когда я проверял один, другой не отмечен.

https://i.stack.imgur.com/yKJt8.png

Изображение 2: https://i.stack.imgur.com/iOnNV.png

Группа радиокнопок должна иметь одну и ту же переменную, чтобы они работали правильно (и иметь разные value= параметры, чтобы вы могли сказать, какой из них был выбран).

jasonharper 22.05.2019 17:12

Радиокнопки специально разработаны, чтобы дать пользователю возможность сделать один выбор из группы. С точки зрения удобства использования кнопка-флажок может ввести пользователя в заблуждение.

Bryan Oakley 22.05.2019 17:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Q: I know i can create radiobuttons but the fact is i have same variable and same value for radiobuttons and when i use radiobuttons i can check both buttons and i can't uncheck them.

Radiobuttons работают немного иначе, чем Checkbuttons. С помощью переключателей вы можете создавать «группы», в которых можно выбрать только одну группу. Вы делаете это так, чтобы все Radiobuttons использовали одно и то же IntVar() в качестве своего поля variable=, а затем каждый Radiobutton имел другое значение.

Вы можете сделать это в цикле, используя enumerate for loop, например:

diagramVars = {}
diagramVar = IntVar()

for i, element in enumerate(self.listdiagram.dict_diagrams):
    diagram = Radiobutton(self.window, text=element, variable=diagramVar, value=i)
    diagram.pack(side=BOTTOM, expand=1)

    self.diagramVars[self.listdiagram.dict_diagrams.get(element)] = diagramVar

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

Для этого вам не понадобится словарь, так как значение IntVar будет выбрано RadioButton.

Например. Если выбрано Radiobutton #1, то diagramVar.get() вернет 0, если выбрано Radiobutton #2, то diagramVar.get() вернет 1 и т. д. Это связано с тем, что группы переключателей должны быть одинаковыми IntVar()

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

Lucas 23.05.2019 09:36

Я редактирую исходный пост со скриншотом того, как это выглядит

Lucas 23.05.2019 09:46

@ Лукас, о, извини, да, я случайно забыл удалить строку кода, у меня все еще была определена диаграммаVar внутри, теперь она должна работать.

MatthewG 23.05.2019 10:06

Перед вашим ответом я попробовал это, и это решило проблему обоих выбранных, но теперь обе переменные равны (я поместил скриншот в конец моего исходного сообщения!)

Lucas 23.05.2019 10:12

@ Лукас, я объяснил это в своем ответе. Это связано с тем, что радиокнопки теперь используют одну и ту же переменную IntVar(), и поэтому теперь intVar представляет, какая радиокнопка нажата, а не то, нажата ли сама радиокнопка.

MatthewG 23.05.2019 10:19

нет возможности с радиокнопками иметь 0 для всех неотмеченных радиокнопок и i для радиокнопки, которая выбрана?

Lucas 23.05.2019 10:27

Все в порядке, спасибо! как я уже сказал, я постараюсь сделать: if diagramVar.get() = 1 so i pick the data of the element 1 in the dictionnary

Lucas 23.05.2019 10:30

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