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

Time:06-15

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!

CodePudding user response:

You get the error of NoneType because at one point it was assigned nothing. This is because you used .grid on the same line as the button. Fixed code:

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)
check_button.grid(column=0, row=4)

root.mainloop()

CodePudding user response:

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(
    root, text = "check", 
    command = validation_pw).grid(column=0, row=4) # Result of Button.grid function
print(check_button) # None

After:

check_button = Button(root, text = "check", command = validation_pw)
check_button.grid(column=0, row=4)
print(check_button) # Button object ...
  • Related