Skip to content
Advertisement

Python, Tkinter – Enable/Disable buttons only when a radio button is selected

So here’s my code

root = Tk()

# 1st frame
frame_1 = LabelFrame(root)
frame_1.pack()

#var
var = IntVar()
var.set(0)
test = ['test1', 'test2', 'test3', 'test4']

# radio button
radio_1 = Radiobutton(frame_1, text = test[0], value = 1, variable = var)
radio_1.pack()
radio_2 = Radiobutton(frame_1, text = test[1], value = 2, variable = var)
radio_2.pack()
radio_3 = Radiobutton(frame_1, text = test[2], value = 3, variable = var)
radio_3.pack()

# 2nd frame
frame_2 = LabelFrame(root)
frame_2.pack()

# buttons
button_1 = Button(frame_2, text =  test[0], state = DISABLED)
button_1.pack()
button_2 = Button(frame_2, text =  test[1], state = DISABLED)
button_2.pack()
button_3 = Button(frame_2, text =  test[2], state = DISABLED)
button_3.pack()
button_4 = Button(frame_2, text =  test[3], state = DISABLED)
button_4.pack()

root.mainloop()

What I’m trying to do is have the buttons enabled when the radio buttons are selected. Here’s what I tried.

def changeState():
    if var.get() != 0:
       button_1['state'] = NORMAL
       button_2['state'] = NORMAL
       button_3['state'] = NORMAL
       button_4['state'] = NORMAL

changeState()

I believe this only sets it initially, and when I select a radio button or change it, it doesn’t update. I think I can use command inside the buttons but don’t understand how to go about it.

Advertisement

Answer

I added four function., Then in Radiobutton, I added command=changeState for each Radiobuuton.

Try this:

from tkinter import *

root = Tk()

# 1st frame
frame_1 = LabelFrame(root)
frame_1.pack()

#var
var = IntVar()
var.set(0)
test = ['test1', 'test2', 'test3', 'test4']

def changeState1():
    if var.get() !=0:
       button_1['state'] = NORMAL
       button_2['state'] = DISABLED
       button_3['state'] = DISABLED
       button_4['state'] = DISABLED

def changeState2():
    if var.get() !=0:
       button_1['state'] = DISABLED
       button_2['state'] = NORMAL
       button_3['state'] = DISABLED
       button_4['state'] = DISABLED       


def changeState3():
    if var.get() !=0:
       button_1['state'] = DISABLED
       button_2['state'] = DISABLED
       button_3['state'] = NORMAL
       button_4['state'] = DISABLED

def changeState4():
    if var.get() !=0:
       button_1['state'] = DISABLED
       button_2['state'] = DISABLED
       button_3['state'] = DISABLED
       button_4['state'] = NORMAL      
       
# radio button
radio_1 = Radiobutton(frame_1, text = test[0], value = 1,command=changeState1, variable = var)
radio_1.pack()
radio_2 = Radiobutton(frame_1, text = test[1], value = 2, command=changeState2, variable = var)
radio_2.pack()
radio_3 = Radiobutton(frame_1, text = test[2], value = 3,command=changeState3, variable = var)
radio_3.pack()
radio_4= Radiobutton(frame_1, text = test[2], value = 3,command=changeState4, variable = var)
radio_4.pack()

# 2nd frame
frame_2 = LabelFrame(root)
frame_2.pack()

# buttons
button_1 = Button(frame_2, text =  test[0],  state = DISABLED)
button_1.pack()
button_2 = Button(frame_2, text =  test[1], state = DISABLED)
button_2.pack()
button_3 = Button(frame_2, text =  test[2], state = DISABLED)
button_3.pack()
button_4 = Button(frame_2, text =  test[3], state = DISABLED)
button_4.pack()
  
root.mainloop()
changeState()
Advertisement