Okym
Okym

Reputation: 259

How do I stop a button command when another button is clicked in python?

So my intention is when the user clicks one of the buttons, for the rest of the other buttons not to perform anything even when clicked, so basically to stop the buttons from performing their commands when the user clicks them ONLY if they have clicked in another button previously, I don't know if I expressed myself well so I am sorry if I dind't but here's my code:

from tkinter import *
import random    

screen = Tk()    

ticket = random.randint(1,3)    

def test():
    def test1():
        if ticket == button1:
            button_1 = Button(screen, text="RIP", fg="white", bg="red", width=15, height=2)
            button_1.grid(row=0, column=0, sticky="w")
        else:
            button_2 = Button(screen, text="+1", fg="white", bg="green", width=15, height=2)
            button_2.grid(row=0, column=0, sticky="w")
    def test2():
        if ticket == button2:
            button_3 = Button(screen, text="RIP", fg="white", bg="red", width=15, height=2)
            button_3.grid(row=0, column=1, sticky="w")
        else:
            button_4 = Button(screen, text="+1", fg="white", bg="green", width=15, height=2)
            button_4.grid(row=0, column=1, sticky="w")
    def test3():
        if ticket == button3:
            button_5 = Button(screen, text="RIP", fg="white", bg="red", width=15, height=2)
            button_5.grid(row=0, column=2, sticky="w")
        else:
            button_6 = Button(screen, text="+1", fg="white", bg="green", width=15, height=2)
            button_6.grid(row=0, column=2, sticky="w")    

    ticket = random.randint(1,3)    

    button1 = Button(screen, text="1", fg="white", bg="blue", width=15, height=2, command=test1)
    button1.grid(row=0, column=0, sticky="w")
    button1 = 1    

    button2 = Button(screen, text="2", fg="white", bg="blue", width=15, height=2, command=test2)
    button2.grid(row=0, column=1, sticky="w"+"e"+"n"+"s")
    button2 = 2    

    button3 = Button(screen, text="3", fg="white", bg="blue", width=15, height=2, command=test3)
    button3.grid(row=0, column=2, sticky="e")
    button3 = 3    

button1 = Button(screen, text="START", fg="black", bg="orange", width=25, height=2, command=test)
button1.grid(row=1, columnspan=3, sticky="w"+"e"+"n"+"s")    

screen.mainloop()

Upvotes: 0

Views: 508

Answers (1)

Novel
Novel

Reputation: 13729

You can set the state of the other Buttons to DISABLED to grey them out and prevent clicks. This would be the ideal place to use a subclass that keeps track of its instances.

from tkinter import *
import random

screen = Tk()

class MykoButton(Button):
    instances = []

    def __init__(self, master=None, **kwargs):
        super().__init__(master, command=self.run, **kwargs)
        self.instances.append(self)

    def run(self):
        for button in self.instances:
            if button is not self:
                button.config(state=DISABLED)
        if random.randint(1,3) == 1:
            self.config(text="RIP", fg="white", bg="red") # update the button
        else:
            self.config(text="+1", fg="white", bg="green")

def test():
    for i in range(3):
        button = MykoButton(screen, text="1", fg="white", bg="blue", width=15, height=2)
        button.grid(row=0, column=i)

button1 = Button(screen, text="START", fg="black", bg="orange", width=25, height=2, command=test)
button1.grid(row=1, columnspan=3, sticky="w"+"e"+"n"+"s")

screen.mainloop()

Also, note that I changed your code to update the clicked button, rather than put a new button on top of it.

Upvotes: 4

Related Questions