Home > Net >  Allow only one radiobutton selection in Tkinter at a time
Allow only one radiobutton selection in Tkinter at a time

Time:03-09

I am trying to learn the basics of the tkinter module. I made this program where I have some questions and each question has some options. My options are displayed using radio button selection. I want to select one choice at a time for each question independently. Currently when I select the 1st option then the 1st option of every question is selected but I don't want the selection for other than the one I am on.

My second question is once the selection [is made] I want to use the selection results and compare them with the answer keys to see how many answers are correct. How do I store the user's answer for each question?

Output result:

screenshot

Edit: Sorry for not posting my code as well. Here is my python file which I am working on.

 from tkinter import *

 guessOptions =[]

 def display():
    global guessOptions
 if x.get() == 0:
    guessOptions.append("A")
 elif x.get() == 1:
    guessOptions.append("B")
elif x.get() == 2:
    guessOptions.append("C")
else:
    guessOptions.append("D")

window = Tk()
answers = ['A', 'B', 'C', 'D']
questions = ["Who invented Bulb? ",
             "Which is not passive component? ",
             "Which is not related to computer? ",
             "Opertor used for and operation? "]

options = [['A. Thomas Edison', 'B. Nikola Tesla', 'C. Albert  
           Einstien', 'D. Michael Faraday'],
           ['A. Inductor', 'B. op-amp', 'C. Capacitor', 'D. 
            Resistor'],
           ['A. RAM', 'B. SSD', 'C. Heat', 'D. Keyboard'],
           ['!', '~', '||', '&']]

x = IntVar()

for i in range(len(questions)):
    label = Label(window,
                  text=questions[i],
                  font=('Arial', 15, 'bold'))
    label.pack(anchor=W)
    for j in range(len(options)):
        checkButton = Radiobutton(window,
                                  text=options[i][j],
                                  variable=x,
                                  value=[j],
                                  padx=10,
                                  font=('Arial', 10),
                                  command=display
                                  )
        checkButton.pack(anchor=W)

window.mainloop()

CodePudding user response:

Each group of answers to a question needs its own IntVar and you'll need to add a Button to trigger the answer checking process. I've done most of that in the code below, except that check_answers() function doesn't really do anything meaningful since you haven't specified exactly what would be involved (or even what the correct choices are).

from tkinter import *

guessOptions =[]

def display(x):
    global guessOptions

    if x.get() == 0:
        guessOptions.append("A")
    elif x.get() == 1:
        guessOptions.append("B")
    elif x.get() == 2:
        guessOptions.append("C")
    else:
        guessOptions.append("D")

def check_answers():
    print(f'{guessOptions=}')


window = Tk()
answers = ['A', 'B', 'C', 'D']
questions = ["Who invented bulb? ",
             "Which is not passive component? ",
             "Which is not related to computer? ",
             "Operator used for and operation? "]

options = [['A. Thomas Edison', 'B. Nikola Tesla', 'C. Albert Einstein',
            'D. Michael Faraday'],
           ['A. Inductor', 'B. Op-amp', 'C. Capacitor', 'D. Resistor'],
           ['A. RAM', 'B. SSD', 'C. Heat', 'D. Keyboard'],
           ['!', '~', '||', '&']]

variables = []
for i in range(len(questions)):
    label = Label(window, text=questions[i], font=('Arial', 15, 'bold'))
    label.pack(anchor=W)

    var = IntVar(value=-1)
    variables.append(var)  # Save for possible later use - one per question.

    def handler(variable=var):
        """Callback for this question and group of answers."""
        display(variable)

    for j in range(len(options)):
        checkButton = Radiobutton(window, text=options[i][j], variable=var,
                                  value=j, padx=10, font=('Arial', 10),
                                  command=handler)
        checkButton.pack(anchor=W)

comp_btn = Button(window, text="Check Answers", command=check_answers)
comp_btn.pack()

window.mainloop()

  • Related