python - 我究竟做错了什么?使用 Tkinter 和随机的 Python 密码生成器
问题描述
我开始使用 Tkinter 和随机在 Python 3.8.1 中制作一个简单的密码生成器,但是我遇到了一个问题。我想添加复选框(在 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() 从所有变量中删除元素,因为不可能减去字符串。
解决方案
问题是您必须使用everything=everything.replace("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "")
. 请记住,字符串不能像列表一样更改,因此字符串方法而不是更改字符串会返回一个新方法。
推荐阅读
- c++ - 使用 while(cin>>) 的 C++ 代码无法终止并输出最后一个查询的答案
- javascript - 如何使用 Vuejs 以动态形式迭代和修改数据
- ruby-on-rails - 从路由名称查找路由的定义位置
- android - 实现共享位置地点选择器,与没有地点选择器的 WhatsApp 相同,因为它已被弃用
- vagrant - 运行厨房测试时无法接受许可证
- c# - 如何查找数字(在最小-最大范围内)和等于数字总和=一个数字的所有序列
- android - AzureSpatialAnchors 基本演示不保存
- javascript - 如何在没有引导程序的情况下使图像在较低分辨率上正确定位?
- r - 当一些文件包含错误时并行处理运行多个文件
- python - 如何将自定义字段添加到 ModelView (flask-appbuild)