我正在创建一个简单的密码生成器,它应该会在每次我按下按钮时创建一个新的密码生成器.我该怎么做呢?每次我这样做时,它都打印/显示相同的密码.我想我明白为什么它不能以我想要的方式工作,但我不知道如何修复它.谢谢.

from tkinter import *
import random
    
def password_generator():
    numbers = "1234567890"
    upper_case_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    lower_case_letters = "abcdefghijklmnopqrstuvwxyz"
    special_chars = "!@#$%^&*()[];:"
    
    password_length = random.randint(9, 15)
    
    combo = numbers + upper_case_letters + lower_case_letters + special_chars
    
    password = "".join(random.sample(combo, password_length))
    
    return password
    
    
def printSomething():
    label = Label(window, text = password)
    label.pack() 

password = password_generator()
window = Tk()
    
window.geometry("400x250")
window.title("Password Generator")
window.config(background = "black")

button = Button(window, text = "Generate")
button.pack()
button.config(command = printSomething) 
button.config(font = ("", 50, "bold")) 
    
window.mainloop()

推荐答案

该行运行该函数并返回单个生成的密码:

password = password_generator()

因此,在运行用户界面之前就已经生成了密码.

相反,删除此行,并在每次调用函数printSomething()时生成一个新密码,即该函数应为

def printSomething():
    label = Label(window, text = password_generator())
    label.pack() 

注意,我用password_generator()替换了password,它已经调用了函数并生成了单个密码,它在每次调用printSomething()时都会调用函数.这样,用户每次单击该按钮时都会生成一个新密码.

Python相关问答推荐

零填充2D数组上的Numpy切片

在后台运行的Python函数

每个组每第n行就有Pandas

如何在不使用字符串的情况下将namedtuple属性传递给方法?

Numpy索引argsorted使用integer数组,同时保留排序顺序

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

遵循轮廓中对象方向的计算线

通过交换 node 对链接列表进行 Select 排序

多处理代码在while循环中不工作

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

如何使用Jinja语法在HTML中重定向期间传递变量?

从dict的列中分钟

使用setuptools pyproject.toml和自定义目录树构建PyPi包

将9个3x3矩阵按特定顺序排列成9x9矩阵

使用密钥字典重新配置嵌套字典密钥名

joblib:无法从父目录的另一个子文件夹加载转储模型

调用decorator返回原始函数的输出

Django admin Csrf令牌未设置

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?