【发布时间】:2020-11-25 13:18:31
【问题描述】:
我开始在 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() 从所有变量中删除元素,因为不可能减去字符串。
【问题讨论】:
-
顺便说一句,“大”和“小”字母通常被描述为“大写”和“小写”。
标签: python python-3.x tkinter random