6

I'm new to Python and I'm trying to make a simple application using Tkinter.

def appear(x):
    return lambda: results.insert(END, x)

letters=["A", "T", "D", "M", "E", "A", "S", "R", "M"] 

for index in range(9): 
    n=letters[index] 
    nButton = Button(buttons, bg="White", text=n, width=5, height=1,
    command =appear(n), relief=GROOVE).grid(padx=2, pady=2, row=index%3,
    column=index/3)

What I'm trying to do is disable the buttons once I click them. I tried

def appear(x):
    nButton.config(state="disabled")
    return lambda: results.insert(END, x)

But it gives me the following error:

NameError: global name 'nButton' is not defined

3 Answers 3

5

There are a few issues here:

  1. Whenever you create widgets dynamically, you need to store references to them in a collection so that you can access them later.

  2. The grid method of a Tkinter widget always returns None. So, you need to put any calls to grid on their own line.

  3. Whenever you assign a button's command option to a function that requires arguments, you must use a lambda or such to "hide" that call of the function until the button is clicked. For more information, see https://stackoverflow.com/a/20556892/2555451.

Below is a sample script addressing all of these issues:

from Tkinter import Tk, Button, GROOVE

root = Tk()

def appear(index, letter):
    # This line would be where you insert the letter in the textbox
    print letter

    # Disable the button by index
    buttons[index].config(state="disabled")

letters=["A", "T", "D", "M", "E", "A", "S", "R", "M"]

# A collection (list) to hold the references to the buttons created below
buttons = []

for index in range(9): 
    n=letters[index]

    button = Button(root, bg="White", text=n, width=5, height=1, relief=GROOVE,
                    command=lambda index=index, n=n: appear(index, n))

    # Add the button to the window
    button.grid(padx=2, pady=2, row=index%3, column=index/3)

    # Add a reference to the button to 'buttons'
    buttons.append(button)

root.mainloop()
Sign up to request clarification or add additional context in comments.

Comments

1

If you want to disable a button after clicking you can make a function in which you will do the desired operation but in the start you should a command to disable the button so that as the function runs it desables the button . if you want you can take a little bit help with this code:-

from tkinter import *
root = Tk()

def disable_button():
    button_1['state'] = DISABLED
    print("this is how you disable a buuton after a click")
button_1 = Button(root,text = "Disable this button",command=disable_button)
button_1.pack()
root.mainloop()

I hope your problem has been solved

Thanks

Comments

-1

This was very helpful for a work I'm currently working on, to add a minor correction

from math import floor



button.grid(padx=2, pady=2, row=index%3, column=floor(index/3))

1 Comment

Is this a solution?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.