Что я делаю не так? Генератор паролей в Python с использованием Tkinter и random

#python #python-3.x #tkinter #random

#python #python-3.x #tkinter #Случайный

Вопрос:

Я начал создавать простой генератор паролей на Python 3.8.1, используя Tkinter и random, но у меня проблема. Я хочу добавить флажки (в Tkinter: checkbuttons), но что-то не так. В флажках можно было бы выбрать элементы, из которых генерируется пароль. Это делается таким образом, что при установке флажка заданный набор символов, например, букв или цифр, добавляется в список символов, из которых генерируется пароль. Проблема в том, что когда вы снимаете флажок, элементы не удаляются из списка символов, и пароль по-прежнему генерируется с использованием предыдущих параметров.

 import random
from tkinter import *
from tkinter import messagebox
import clipboard

# Define window
app = Tk()
app.geometry("305x155")
app.title("Password Generator")
# Items used to generate password
uppercase_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lowercase_letters = "abcdefghijklmnopqrstuvwxyz"
digits = "0123456789"
# From which items you want to generate password
upper = BooleanVar()
lower = BooleanVar()
nums = BooleanVar()

everything = ""

def check_1():
    global upper, lower, nums
    global everything
    # Add items what you want to everything variable
    if upper.get() == True:
        everything  = uppercase_letters
    if upper.get() == False:
        everything.replace("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "")
def check_2():
    global upper, lower, nums
    global everything
    if lower.get() == True:
        everything  = lowercase_letters
    if lower.get() == False:
        everything.replace("abcdefghijklmnopqrstuvwxyz", "")
def check_3():
    global upper, lower, nums
    global everything
    if nums.get() == True:
        everything  = digits
    if nums.get() == False:
        everything.replace("0123456789", "")

CheckboxLabel_1 = Label(app, text="Big Letters")
CheckboxLabel_1.grid(row=2, column=5)

CheckboxLabel_2 = Label(app, text="Low Letters")
CheckboxLabel_2.grid(row=3, column=5)

CheckboxLabel_3 = Label(app, text="Numbers")
CheckboxLabel_3.grid(row=4, column=5)

Checkbox_1 = Checkbutton(app, text="", variable=upper, onvalue = True, offvalue= False, command=check_1)
Checkbox_1.grid(row=2, column=6)

Checkbox_2 = Checkbutton(app, text="", variable=lower, onvalue = True, offvalue= False, command=check_2)
Checkbox_2.grid(row=3, column=6)

Checkbox_3 = Checkbutton(app, text="", variable=nums, onvalue = True, offvalue= False, command=check_3)
Checkbox_3.grid(row=4, column=6)

LengthText = Label(app, text="Length: ")
LengthText.grid(row=0, column=5)

Space = Label(app, text="")
Space.grid(row=0, column=4)

length = Entry(app, width=4) # Length of your password
length.insert(0, "20") # Default length (max. 62)
length.grid(row=0, column=6)

AmountText = Label(app, text="Amount: ")
AmountText.grid(row=1, column=5)

amount = Entry(app, width=4) # Amount of generated passwords
amount.insert(0, "1") # Default amount
amount.grid(row=1, column=6)

Generated = Label(app, text="Generated password:") 
Generated.grid(row=0, column=1)

Space_1 = Label(app, text="")
Space_1.grid(row=1, column=0)

PasswordText = Entry(app, width=25) # Text box
PasswordText.grid(row=1, column=1)

# Generating password function
def generate_password():
    PasswordText.delete(0, END) # Clear text box before writing a new password
    for x in range(int(amount.get())):
        password = "".join(random.sample(everything, int(length.get())))
        PasswordText.insert(0, password) # Past password into text box
    Completed = Label(app, text="Password generated.", fg="green") # Show info
    Completed.grid(row=3, column=1)

Submit = Button(app, text="Generate", command=generate_password) # Generating button
Submit.grid(row=2, column=1)

# Copying password to clipboard
def copytoclipboard():
    clipboard.copy(PasswordText.get())
    messagebox.showinfo(title="Info", message="Password copied to clipboard.")
    
Copy = Button(app, text="Copy", command=copytoclipboard) # Copying button
Copy.grid(row=1, column=3)

app.mainloop()
 

Я использовал replace() для удаления элементов из всех переменных, потому что невозможно вычесть строки.

Флажки с цифрами и большими буквами сняты, но программа по-прежнему использует их для генерации паролей (фото)

Комментарии:

1. Просто в качестве отступа, «Большие» и «низкие» буквы обычно описываются как «Прописные» и «Строчные».

Ответ №1:

Проблема в том, что вы должны использовать everything=everything.replace("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "") . Помните, что строки нельзя изменять, как списки, поэтому строковые методы вместо изменения строки возвращают новую.