James
James

Reputation: 13

How to clear a label using tkinter when pressing a button?

I am using labels to show a generated password in my tkinter password generator program, but when I change the length of a password from a lower value than before (for example from a length of 20 to 10) the label displaying the password appears to be overwritten - it does not clear. I have searched methods to do this, but I cannot seem to find any.

Here is my code:

from tkinter import *
from random import *
import string

root = Tk()
root.wm_title("Password Generator")
topFrame = Frame(root)
topFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
root.geometry("1000x1000")

title = Label(topFrame, text="Length", fg="blue")
title.grid(row=3,column=5)

var = DoubleVar()
Slider_1 = Scale(root,orient=HORIZONTAL,length=32*10,from_=0,to=32, variable 
= var)
Slider_1.pack()
passLen = var.get()

uppercaseLetters = "QWERTYUIOPASDFGHJKLZXCVBNM"
lowercaseLetters = "qwertyuiopasdfghjklzxcvbnm"
symbols = "!£$%^&*()_+-=}{][~@#':;?>/.<,"
digits = "1234567890"

def gen():
    characters = uppercaseLetters + lowercaseLetters + symbols + digits
    password = "".join(choice(characters) for x in range(int(var.get())))
    passLabel = Label(topFrame, text=password)
    passLabel.grid(row=4, column=5)

    genButton = Button(topFrame, text="Generate Password", fg="blue", 
    command=gen)
    genButton.grid(row=1, column=5)

    root.mainloop()

When I set the length to 32 characters:

screenshot

And when I set the length to 6 characters it does not clear the old password label - it simply overwrites it in the middle of the old password label:

screenshot2

Upvotes: 0

Views: 26338

Answers (3)

Nae
Nae

Reputation: 15355

"How to clear a label using tkinter when pressing a button?"

Below is an example that clears label's text when the button is pressed:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def clear_widget_text(widget):
    widget['text'] = ""


if __name__ == '__main__':
    root = tk.Tk()
    label = tk.Label(root, text="This will be cleared.")
    button = tk.Button(root, text="Clear",
                                    command=lambda : clear_widget_text(label))
    label.pack()
    button.pack()
    root.mainloop()

Below is an example that destroys label when button is pressed:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def clear_widget(widget):
    widget.destroy()


if __name__ == '__main__':
    root = tk.Tk()
    label = tk.Label(root, text="This will be cleared.")
    button = tk.Button(root, text="Clear",
                                    command=lambda : clear_widget(label))
    label.pack()
    button.pack()
    root.mainloop()

Upvotes: 0

Nae
Nae

Reputation: 15355

First of all, move your gen method definition to just below imports so that they're recognized in the main body. Then take your widgets and mainloop out of the method. Just configure passLabel's text when needed:

def gen():
    characters = uppercaseLetters + lowercaseLetters + symbols + digits
    password = "".join(choice(characters) for x in range(int(var.get())))
    passLabel['text'] = password

Entire code with suggested edits been made:

from tkinter import *
from random import *
import string

def gen():
    characters = uppercaseLetters + lowercaseLetters + symbols + digits
    password = "".join(choice(characters) for x in range(int(var.get())))
    passLabel['text'] = password

root = Tk()
root.wm_title("Password Generator")
topFrame = Frame(root)
topFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
root.geometry("1000x1000")

title = Label(topFrame, text="Length", fg="blue")
title.grid(row=3,column=5)



var = DoubleVar()
Slider_1 = Scale(root,orient=HORIZONTAL,length=32*10,from_=0,to=32, variable 
= var)
Slider_1.pack()
passLen = var.get()

uppercaseLetters = "QWERTYUIOPASDFGHJKLZXCVBNM"
lowercaseLetters = "qwertyuiopasdfghjklzxcvbnm"
symbols = "!£$%^&*()_+-=}{][~@#':;?>/.<,"
digits = "1234567890"

passLabel = Label(topFrame)
passLabel.grid(row=4, column=5)
genButton = Button(topFrame, text="Generate Password", fg="blue", 
command=gen)
genButton.grid(row=1, column=5)
root.mainloop()

Upvotes: 2

MegaIng
MegaIng

Reputation: 7886

Change two things: First:

bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
passLabel = Label(topFrame)
root.geometry("1000x1000")

Second:

def gen():
    characters = uppercaseLetters + lowercaseLetters + symbols + digits
    password = "".join(choice(characters) for x in range(int(var.get())))
    passLabel.config(text=password)
    passLabel.grid(row=4, column=5)

Upvotes: 1

Related Questions