如何修复此密码生成器代码以打印所需的结果

Posted

技术标签:

【中文标题】如何修复此密码生成器代码以打印所需的结果【英文标题】:How Can I fix This Password Generator Code To Print The Desired Result 【发布时间】:2022-01-05 16:13:46 【问题描述】:

我目前正在开发 v1 的密码生成器。我一直在研究视觉元素,现在开始研究实际的密码生成。我一直在使用 pydroid 3 和 tkinter 在我的 android 设备上编写代码。

我让程序有三个复选框,分别代表大写、数字和特殊字符;以及所需密码长度的输入字段。我创建了第一个在选中所有复选框时执行的 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()

【问题讨论】:

我正在 Windows 上运行您的代码,但没有看到该错误。我也没有看到任何密码生成。您确定发布了最新版本的代码吗? 您的代码没有按照您认为的方式运行。但我可以告诉你,在你的函数调用中,你首先将“密码”设置为 StringVar,然后在 if 你将其覆盖为强而不是将结果分配给 StringVar 【参考方案1】:

你的 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 个字符,全部小写。然后,您可以使用复选框和条目小部件(用于密码长度)覆盖它。

【讨论】:

非常感谢您的回复!我肯定会对多用途变量的使用更加谨慎!我没有意识到每次我需要访问一个值时我都想使用 get(),感谢您清除它。我非常感谢您的反馈和帮助♥ 基于此,我刚刚想出了如何使用更少的 if 参数进行编码,再次感谢您的精彩回复♥ ♥ ♥【参考方案2】:

你错过了一些......

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()

【讨论】:

这个答案可以做一个解释。代码太长,不值得仔细检查每一行代码,看看你做了什么。此外,如果没有解释,答案的价值就会降低,因为未来遇到类似问题的用户将不得不猜测是什么解决了这个问题。请参阅How to Answer 了解更多信息。 感谢您的反馈,我会记住差异♥

以上是关于如何修复此密码生成器代码以打印所需的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何触发 Firebase 云功能以添加用户、生成密码并使用该密码发送邮件

使用脚本生成一堆新用户以生成newusers命令所需的输出

如何打印(在屏幕上)带有外部 url 的 iframe 所需的所有 JS 代码

在授权所需的服务器中测试用户名和密码的程序? [关闭]

如果这包括那个(java密码生成器)[关闭]

验证 Membership.GeneratePassword