如何修复此密码生成器代码以打印所需的结果
How Can I fix This Password Generator Code To Print The Desired Result
我目前正在开发密码生成器的 v1。我一直在研究视觉元素,现在开始研究实际的密码生成。我一直在我的 android 设备上使用 pydroid 3 和 tkinter 对此进行编码。
我让程序有大写字母、数字和特殊字符三个复选框;以及所需密码长度的输入字段。我创建了第一个在所有复选框都被选中时执行的 if 语句,但是在点击生成按钮时测试它会导致“PY_VAR4”结果,每次按下按钮时 4 都会增加(PY_VAR4、PY_VAR5、等等)。
你们对我如何解决这个问题有什么建议吗?我尝试使用变量或 label["text"] = "text"
代码尝试不同的方法来更改结果标签的文本,但这似乎无法解决问题。我还测试了密码长度变量(将其直接插入结果标签)和勾选框变量,它似乎有效。我得出的结论是,它一定是 if 语句或生成代码中的某些内容,但我一直无法弄清楚它可能是什么。我不确定此时还有什么可以测试和玩的。
代码如下:
import tkinter as tk
import random
import string
#randomized password based on ticked boxes
def final(event):
password = tk.StringVar(value="")
password_length = size.get()
if uppercase_on == True and special_chars_on == True and numbers_on == True:
characters = string.ascii_letters + string.digits + string.punctuation
password = "".join(secret.choice(characters) for i in range(password_length))
result["textvariable"] = password
# start of gui
window = tk.Tk()
# some variables.
no_result = tk.StringVar(value="")
# title
title_text = tk.Label(
text="Aero's Pawsword Generator",
fg="brown",
bg="grey",
height=5
)
# Action prompt text
action_descriptor = tk.Label(
text="Select the appropriate option and tap Generate!",
height=5
)
#size input field + text
size_text = tk.Label(text="Size")
size = tk.Entry(
width=3,
fg="grey"
)
# uppercase tick box + variable
uppercase_on = tk.BooleanVar(value=False)
upper = tk.Checkbutton(
text="Uppercase Included",
variable=uppercase_on,
onvalue=True,
offvalue=False,
height=3
)
# special characters tick box + variable
special_chars_on = tk.BooleanVar(value=False)
special_chars = tk.Checkbutton(
text = "Special Characters Included",
variable=special_chars_on,
onvalue=True,
offvalue=False,
height=3
)
# numbers tick box + variable
numbers_on = tk.BooleanVar(value=False)
numbers = tk.Checkbutton(
text="Numbers Included",
variable=numbers_on,
onvalue=True,
offvalue=False,
height=3
)
# generate button
generate = tk.Button(
text="Generate",
width=5,
height=2,
bg="grey",
fg="brown"
)
# results label, empty until something has been generated
result = tk.Label(
textvariable=no_result,
height=5
)
# pack all elements
title_text.pack(fill=tk.X)
action_descriptor.pack(fill=tk.X)
size_text.pack(fill=tk.X)
size.pack()
upper.pack()
special_chars.pack()
numbers.pack()
generate.pack()
result.pack(fill=tk.X)
generate.bind("<Button-1>", final)
window.mainloop()
你错过了一些......
def final():
password = tk.StringVar(value="")
password_length = size.get()
if uppercase_on.get() == True and special_chars_on.get() == True and numbers_on.get() == True:
characters = string.ascii_letters + string.digits + string.punctuation
for i in range(int(password_length)) :
password.set(str(password.get())+random.choice(characters))
no_result.set(str(password.get()))
和
# generate button
generate = tk.Button(
text="Generate",
width=5,
height=2,
bg="grey",
fg="brown",
command=final
)
最后删除绑定
upper.pack()
special_chars.pack()
numbers.pack()
generate.pack()
result.pack()
window.mainloop()
您的 final() 确实有问题。这是一个有效的版本:
#randomized password based on ticked boxes
def final(event):
password = "" # tk.StringVar(value="")
password_length = size.get()
password_length = int(password_length) if password_length else 8
characters = string.ascii_lowercase
if uppercase_on.get():
characters += string.ascii_uppercase
if special_chars_on.get():
characters += string.punctuation
if numbers_on.get():
characters += string.digits
password = "".join(random.choice(characters) for i in range(password_length))
no_result.set(password)
# result["textvariable"] = password
需要注意的一些变化:
您正在更改函数中 password
的类型。您将其作为 StringVar 启动,然后将其更改为 if
中的字符串。将同一个变量用于多个目的时要小心。它使代码更难跟踪和调试。它会导致错误。
您的 if 总是得到满足,因为您必须使用 .get() 方法访问 StringVar(或其他 Tkinter 变量)的值。否则,您将获得 Python 视为逻辑 True 的实际 Tkinter 变量。
您需要将密码的不同部分分开。所以,我假设默认密码是 8 个字符,全部小写。然后,您可以使用复选框和输入小部件(密码长度)覆盖它。
我目前正在开发密码生成器的 v1。我一直在研究视觉元素,现在开始研究实际的密码生成。我一直在我的 android 设备上使用 pydroid 3 和 tkinter 对此进行编码。
我让程序有大写字母、数字和特殊字符三个复选框;以及所需密码长度的输入字段。我创建了第一个在所有复选框都被选中时执行的 if 语句,但是在点击生成按钮时测试它会导致“PY_VAR4”结果,每次按下按钮时 4 都会增加(PY_VAR4、PY_VAR5、等等)。
你们对我如何解决这个问题有什么建议吗?我尝试使用变量或 label["text"] = "text"
代码尝试不同的方法来更改结果标签的文本,但这似乎无法解决问题。我还测试了密码长度变量(将其直接插入结果标签)和勾选框变量,它似乎有效。我得出的结论是,它一定是 if 语句或生成代码中的某些内容,但我一直无法弄清楚它可能是什么。我不确定此时还有什么可以测试和玩的。
代码如下:
import tkinter as tk
import random
import string
#randomized password based on ticked boxes
def final(event):
password = tk.StringVar(value="")
password_length = size.get()
if uppercase_on == True and special_chars_on == True and numbers_on == True:
characters = string.ascii_letters + string.digits + string.punctuation
password = "".join(secret.choice(characters) for i in range(password_length))
result["textvariable"] = password
# start of gui
window = tk.Tk()
# some variables.
no_result = tk.StringVar(value="")
# title
title_text = tk.Label(
text="Aero's Pawsword Generator",
fg="brown",
bg="grey",
height=5
)
# Action prompt text
action_descriptor = tk.Label(
text="Select the appropriate option and tap Generate!",
height=5
)
#size input field + text
size_text = tk.Label(text="Size")
size = tk.Entry(
width=3,
fg="grey"
)
# uppercase tick box + variable
uppercase_on = tk.BooleanVar(value=False)
upper = tk.Checkbutton(
text="Uppercase Included",
variable=uppercase_on,
onvalue=True,
offvalue=False,
height=3
)
# special characters tick box + variable
special_chars_on = tk.BooleanVar(value=False)
special_chars = tk.Checkbutton(
text = "Special Characters Included",
variable=special_chars_on,
onvalue=True,
offvalue=False,
height=3
)
# numbers tick box + variable
numbers_on = tk.BooleanVar(value=False)
numbers = tk.Checkbutton(
text="Numbers Included",
variable=numbers_on,
onvalue=True,
offvalue=False,
height=3
)
# generate button
generate = tk.Button(
text="Generate",
width=5,
height=2,
bg="grey",
fg="brown"
)
# results label, empty until something has been generated
result = tk.Label(
textvariable=no_result,
height=5
)
# pack all elements
title_text.pack(fill=tk.X)
action_descriptor.pack(fill=tk.X)
size_text.pack(fill=tk.X)
size.pack()
upper.pack()
special_chars.pack()
numbers.pack()
generate.pack()
result.pack(fill=tk.X)
generate.bind("<Button-1>", final)
window.mainloop()
你错过了一些......
def final():
password = tk.StringVar(value="")
password_length = size.get()
if uppercase_on.get() == True and special_chars_on.get() == True and numbers_on.get() == True:
characters = string.ascii_letters + string.digits + string.punctuation
for i in range(int(password_length)) :
password.set(str(password.get())+random.choice(characters))
no_result.set(str(password.get()))
和
# generate button
generate = tk.Button(
text="Generate",
width=5,
height=2,
bg="grey",
fg="brown",
command=final
)
最后删除绑定
upper.pack()
special_chars.pack()
numbers.pack()
generate.pack()
result.pack()
window.mainloop()
您的 final() 确实有问题。这是一个有效的版本:
#randomized password based on ticked boxes
def final(event):
password = "" # tk.StringVar(value="")
password_length = size.get()
password_length = int(password_length) if password_length else 8
characters = string.ascii_lowercase
if uppercase_on.get():
characters += string.ascii_uppercase
if special_chars_on.get():
characters += string.punctuation
if numbers_on.get():
characters += string.digits
password = "".join(random.choice(characters) for i in range(password_length))
no_result.set(password)
# result["textvariable"] = password
需要注意的一些变化:
您正在更改函数中
password
的类型。您将其作为 StringVar 启动,然后将其更改为if
中的字符串。将同一个变量用于多个目的时要小心。它使代码更难跟踪和调试。它会导致错误。您的 if 总是得到满足,因为您必须使用 .get() 方法访问 StringVar(或其他 Tkinter 变量)的值。否则,您将获得 Python 视为逻辑 True 的实际 Tkinter 变量。
您需要将密码的不同部分分开。所以,我假设默认密码是 8 个字符,全部小写。然后,您可以使用复选框和输入小部件(密码长度)覆盖它。