Search code examples
pythontkinterpasswords

(python) Disable the button in Tkinter when passwords do not match


How to disable the button in tkinter window when two passwords does not match?

My work:

from tkinter import *
from functools import partial

root = Tk()
root.geometry('280x100')
root.title('Tkinter Password')

def validation_pw(ep,cp):
    if ep.get() == cp.get():
        Label(root, text = "Confirmed").grid(column=0, row=5)
    else:
        Label(root, text = "Not matched").grid(column=0, row=5)
#         check_button['state'] = DISABLED    <============================
    
ep = StringVar()
cp = StringVar()

Label1 = Label(root, text = "Enter Password").grid(column=0, row=0)
pwEnty = Entry(root, textvariable = ep, show = '*').grid(column=1, row=0) 

# Confirmed password label
Label2 = Label(root, text = "Confirm Password").grid(column=0, row=1)
pwconfEnty = Entry(root, textvariable = cp, show = '*').grid(column=1, row=1)

validation_pw = partial(validation_pw, ep,cp)

check_button = Button(root, text = "check", command = validation_pw).grid(column=0, row=4)

root.mainloop()

It shows if two passwords are not matched.

enter image description here

Now, I want to disable the check button if two passwords are not matched. I want the user cannot try the passwords anymore if failure.
So in the function validation_pw, I add check_button['state'] = DISABLED.
However, an error pops out

TypeError: 'NoneType' object does not support item assignment

How to fix this issue? Thanks!


Solution

  • Your checkbutton is actually None, because it's the result of the grid function.

    To fix it, first declare the button, next grid it.

    Before:

    check_button = Button([...]).grid(column=0, row=4) # Result of Button.grid function
    print(check_button) # None
    

    After:

    check_button = Button([...])
    check_button.grid(column=0, row=4)
    print(check_button) # Button object ...