Skip to content
Advertisement

When enabling a button, disabling the other

Code:

import tkinter as tk

win = tk.Tk()

def all_state():
   button_list = [button1, button2, button3]
   for i in button_list:
     if i['state'] == 'disabled':
       i['state'] = 'active'

button1 = tk.Button(win, text = 'Click me', state = 'disabled', command = all_state)
button1.grid(column = 0, row = 0)

button2 = tk.Button(win, text = 'Now me', state = 'active', command = all_state)
button2.grid(column = 1, row = 0)

button3 = tk.Button(win, text = 'Now', state = 'active', command = all_state)
button3.grid(column = 2, row = 0)

win.mainloop()

Output:

output1

When I click any other button, I get:

output2

All buttons get enabled.

Question:

After I’ve clicked one of the buttons which aren’t disabled, I want this one to get disabled. Let’s say I clicked button button2. Thus, button2 will get disabled as shown:

desired_output

The reason why I haven’t found a solution is because the button that will be selected is arbitrary, so I can’t think of how to do it.

Advertisement

Answer

Pass index when you call the all_state() also place button_list = [button1, button2, button3] outside the function.

Example:

import tkinter as tk

win = tk.Tk()

def all_state(index):

    for btn in button_list:
        btn['state'] = 'active'

    button_list[index]['state'] = 'disabled'
    
button1 = tk.Button(win, text = 'Click me', state = 'disabled', command = lambda :all_state(0))
button1.grid(column = 0, row = 0)

button2 = tk.Button(win, text = 'Now me', state = 'active', command = lambda :all_state(1))
button2.grid(column = 1, row = 0)

button3 = tk.Button(win, text = 'Now', state = 'active', command = lambda :all_state(2))
button3.grid(column = 2, row = 0)

button_list = [button1, button2, button3]

win.mainloop()

Alternatively use event.widget to get the current button:

import tkinter as tk

win = tk.Tk()

def all_state(event):
    btn = event.widget
    for button in win.winfo_children():
        if isinstance(button, tk.Button):
            button['state'] = 'active'

    btn['state'] = 'disabled'
    
button1 = tk.Button(win, text = 'Click me', state = 'disabled')
button1.bind('<1>', all_state)
button1.grid(column = 0, row = 0)

button2 = tk.Button(win, text = 'Now me', state = 'active')
button2.bind('<1>', all_state)
button2.grid(column = 1, row = 0)

button3 = tk.Button(win, text = 'Now', state = 'active')
button3.bind('<1>', all_state)
button3.grid(column = 2, row = 0)

win.mainloop()
Advertisement