Search code examples
pythontkinterpasswordsgenerator

Generator is limiting


It runs, the TK design is fine but the generated code is limited to one type. What it currently does when it runs is pops up a window with (copy and Generate) button, 4 radio buttons (low, medium, strong, powerful), a drop down for the length(8-32), and the entry box where the password does generate.

It currently only generates one type so if you pick low the generated password is in all lower case, if you pick medium all upper case, strong all numbers and powerful all symbols.

I'd like to edit to use a combination of upper,lower,numbers, symbols instead of just one

The full code is listed below



# Python program to generate random
# password using Tkinter module
import random
import pyperclip
from tkinter import *
from tkinter.ttk import *
 
# Function for calculation of password
def low():
    entry.delete(0, END)
 
    # Get the length of password
    length = var1.get()
 
    digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
    symbols = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
    lower = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    upper = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    password = ""
 
    # if strength selected is low
    if var.get() == 1:
        for i in range(0, length):
            password = password + random.choice(lower)
        return password
 
    # if strength selected is medium
    elif var.get() == 0:
        for i in range(0, length):
            password = password + random.choice(upper)
        return password
 
    # if strength selected is strong
    elif var.get() == 3:
        for i in range(0, length):
            password = password + random.choice(digits)
        return password
    
    #if strength selected is powerful
    elif var.get() == 2:
        for i in range(0, length):
            password = password + random.choice(symbols)
        return password
    else:
        print("Please choose an option")
 
 
# Function for generation of password
def generate():
    password1 = low()
    entry.insert(10, password1)
 
 
# Function for copying password to clipboard
def copy1():
    random_password = entry.get()
    pyperclip.copy(random_password)
 
 
# Main Function
 
# create GUI window
root = Tk()
var = IntVar()
var1 = IntVar()
 
# Title of your GUI window
root.title("Random Password Generator")
 
# create label and entry to show
# password generated
Random_password = Label(root, text="Password")
Random_password.grid(row=0)
entry = Entry(root)
entry.grid(row=0, column=1)
 
# create label for length of password
c_label = Label(root, text="Length")
c_label.grid(row=1)
 
# create Buttons Copy which will copy
# password to clipboard and Generate
# which will generate the password
copy_button = Button(root, text="Copy", command=copy1)
copy_button.grid(row=0, column=2)
generate_button = Button(root, text="Generate", command=generate)
generate_button.grid(row=0, column=3)
 
# Radio Buttons for deciding the
# strength of password
# Default strength is Medium
radio_low = Radiobutton(root, text="Low", variable=var, value=1)
radio_low.grid(row=1, column=2, sticky='E')
radio_middle = Radiobutton(root, text="Medium", variable=var, value=0)
radio_middle.grid(row=1, column=3, sticky='E')
radio_strong = Radiobutton(root, text="Strong", variable=var, value=3)
radio_strong.grid(row=1, column=4, sticky='E')
radio_powerful = Radiobutton(root, text = "Powerful", variable = var, value = 2)
radio_powerful.grid(row = 1, column = 5, sticky = 'E')
combo = Combobox(root, textvariable=var1)
 
# Combo Box for length of your password
combo['values'] = (8, 9, 10, 11, 12, 13, 14, 15, 16,
                   17, 18, 19, 20, 21, 22, 23, 24, 25,
                   26, 27, 28, 29, 30, 31, 32)
combo.current(0)
combo.bind('<<ComboboxSelected>>')
combo.grid(column=1, row=1)
 
# start the GUI
root.mainloop()

I did try on line 43

            password = password + random.choice(symbols) + random.choice(upper) + random.choice(lower)



 #2nd try
password = password + random.choice(symbols, upper, lower)

This did use symbols, upper and lower case but the length was set to 8 and it generated 24 (8 of each) On the bright side it did randomly put them in Example: (Dh$Yr!Gq$Hy$Zg@Fv&Uz@Af)

The 2nd try resulted in a error: line 43, in low password = password + random.choice(symbols, upper, lower) TypeError: Random.choice() takes 2 positional arguments but 4 were given


Solution

  • try this

     password = password + random.choice(symbols + upper + lower)
    

    OR

    password += random.choice(symbols + upper + lower)
    

    HERE IS YOU FULL CODE> I am writing a comment where I change my code.

    # Python program to generate random
    # password using Tkinter module
    import random
    import pyperclip
    from tkinter import *
    from tkinter.ttk import *
     
    # Function for calculation of password
    def low():
        entry.delete(0, END)
     
        # Get the length of password
        length = var1.get()
     
        digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
        symbols = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
        lower = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
        upper = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
        password = ""
     
        # if strength selected is low
        if var.get() == 1:
            for i in range(0, length):
                password = password + random.choice(lower) # for low security choose letters from lower
            return password
     
        # if strength selected is medium
        elif var.get() == 0:
            for i in range(0, length):
                password = password + random.choice(lower+upper) # for medium security choose letters from lower and upper
            return password
     
        # if strength selected is strong
        elif var.get() == 3:
            for i in range(0, length):
                password = password + random.choice(lower+upper+digits) # for strong security choose letters from lower, upper, and digits.
            return password
        
        #if strength selected is powerful
        elif var.get() == 2:
            for i in range(0, length):
                password = password + random.choice(lower+upper+digits+symbols) # for powerful security choose letters from lower, upper, digits, and symbols.
            return password
        else:
            print("Please choose an option")
     
     
    # Function for generation of password
    def generate():
        password1 = low()
        entry.insert(10, password1)
     
     
    # Function for copying password to clipboard
    def copy1():
        random_password = entry.get()
        pyperclip.copy(random_password)
     
     
    # Main Function
     
    # create GUI window
    root = Tk()
    var = IntVar()
    var1 = IntVar()
     
    # Title of your GUI window
    root.title("Random Password Generator")
     
    # create label and entry to show
    # password generated
    Random_password = Label(root, text="Password")
    Random_password.grid(row=0)
    entry = Entry(root)
    entry.grid(row=0, column=1)
     
    # create label for length of password
    c_label = Label(root, text="Length")
    c_label.grid(row=1)
     
    # create Buttons Copy which will copy
    # password to clipboard and Generate
    # which will generate the password
    copy_button = Button(root, text="Copy", command=copy1)
    copy_button.grid(row=0, column=2)
    generate_button = Button(root, text="Generate", command=generate)
    generate_button.grid(row=0, column=3)
     
    # Radio Buttons for deciding the
    # strength of password
    # Default strength is Medium
    radio_low = Radiobutton(root, text="Low", variable=var, value=1)
    radio_low.grid(row=1, column=2, sticky='E')
    radio_middle = Radiobutton(root, text="Medium", variable=var, value=0)
    radio_middle.grid(row=1, column=3, sticky='E')
    radio_strong = Radiobutton(root, text="Strong", variable=var, value=3)
    radio_strong.grid(row=1, column=4, sticky='E')
    radio_powerful = Radiobutton(root, text = "Powerful", variable = var, value = 2)
    radio_powerful.grid(row = 1, column = 5, sticky = 'E')
    combo = Combobox(root, textvariable=var1)
     
    # Combo Box for length of your password
    combo['values'] = (8, 9, 10, 11, 12, 13, 14, 15, 16,
                       17, 18, 19, 20, 21, 22, 23, 24, 25,
                       26, 27, 28, 29, 30, 31, 32)
    combo.current(0)
    combo.bind('<<ComboboxSelected>>')
    combo.grid(column=1, row=1)
     
    # start the GUI
    root.mainloop()