Python Tkinter随机密码生成器嵌套函数实现异常求助
密码生成器GUI代码修正方案
你原有代码的核心问题出在Tkinter变量取值、变量类型误用两个方面,具体问题和修正如下:
- 问题1:Tkinter的
IntVar/StringVar类型变量必须调用.get()方法才能拿到实际存储的值,你直接判断if CheckBool1是判断变量对象是否存在,永远返回True,完全拿不到复选框的真实选中状态 - 问题2:字符集拼接不需要用
StringVar,用普通字符串即可,且每次生成密码前需要清空字符集,避免多次点击后字符集重复叠加 - 问题3:密码长度取值逻辑错误,你没有将输入框的内容转为整数,反而错误赋值给了
pwlength这个IntVar对象 - 问题4:
random.choices接收的是普通字符串序列,你传入StringVar对象无法完成随机抽取
修正后可直接运行的完整代码:
import random from tkinter import * from tkinter import ttk root = Tk() root.title("密码生成器") uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" lowercase = "abcdefghijklmnopqrstuvwxyz" digits = "1234567890" symbols = "!§$%&?*+#~-;()/" CheckBool1 = IntVar() CheckBool2 = IntVar() CheckBool3 = IntVar() CheckBool4 = IntVar() def add2all(): # 每次调用先重置可选字符集 all_chars = "" if CheckBool1.get() == 1: all_chars += uppercase if CheckBool2.get() == 1: all_chars += lowercase if CheckBool3.get() == 1: all_chars += digits if CheckBool4.get() == 1: all_chars += symbols return all_chars def pwdgen(): pwdoutpt.delete(0, END) # 正确获取密码长度,转为整数,增加异常校验 try: pw_length = int(amt.get()) if pw_length <=0: pwdoutpt.insert(0, "长度需为正整数") return except ValueError: pwdoutpt.insert(0, "请输入合法数字") return # 获取可选字符集 all_chars = add2all() if not all_chars: pwdoutpt.insert(0, "请至少选择一种字符类型") return # 生成密码 password = "".join(random.choices(all_chars, k=pw_length)) pwdoutpt.insert(0, password) greet = Label(root, text="Welcome to the interactive password generator!", height=3) pwdoutpt = Entry(root, width=30) generate = Button(root, text="Generate", command=pwdgen) # 初始化GUI所需的全部标签与复选框 chck_1 = Checkbutton(root, width = 5, var = CheckBool1) chck_2 = Checkbutton(root, width = 5, var = CheckBool2) chck_3 = Checkbutton(root, width = 5, var = CheckBool3) chck_4 = Checkbutton(root, width = 5, var = CheckBool4) lbl_1 = Label(root, text="Capital Letters") lbl_2 = Label(root, text="Lowercase Letters") lbl_3 = Label(root, text="Digits") lbl_4 = Label(root, text="Symbols") amt = Entry(root, width = 5) amtlbl = Label(root, text="Num of characters in pwd.") sep = ttk.Separator(root, orient="horizontal") greet.grid(column=0, row=0, columnspan=4, pady=3) pwdoutpt.grid(column=0, row=7, columnspan=4, padx=30, sticky=W) amt.grid(column=0, row=1, sticky=W) amtlbl.grid(column=1, row=1, columnspan=1, sticky=E) chck_1.grid(column=0, row=2, sticky=E) chck_2.grid(column=0, row=3, sticky=E) chck_3.grid(column=0, row=4, sticky=E) chck_4.grid(column=0, row=5, sticky=E) lbl_1.grid(column=1, row=2, columnspan=1, sticky=W) lbl_2.grid(column=1, row=3, columnspan=1, sticky=W) lbl_3.grid(column=1, row=4, columnspan=1, sticky=W) lbl_4.grid(column=1, row=5, columnspan=1, sticky=W) sep.grid(column=0, columnspan=10, row=6, sticky=EW) generate.grid(column=2, row=7) root.mainloop()
内容的提问来源于stack exchange,提问作者L0renz
相关产品推荐
相关产品推荐

