这是我的代码:
def masterpassgui(password):
masterpassword = password
add_window = tk.Tk()
add_window.title("Master Password")
add_window.geometry("250x250")
masterpass_label = tk.Label(add_window, text="Enter your master password:")
masterpass_label.grid(row=0, column=0, sticky="w")
masterpass_entry = tk.Entry(add_window)
masterpass_entry.grid(row=0, column=1)
masterpass = masterpass_entry.get()
attempts = 5
def on_click():
messagebox.showwarning(f"You have {attempts} attempts left. After that it will lock down.")
while masterpass != masterpassword:
masterpass_label = tk.Label(add_window, text="Enter your master password:")
masterpass_label.grid(row=0, column=0, sticky="w")
masterpass_entry = tk.Entry(add_window)
masterpass_entry.grid(row=0, column=1)
masterpass = masterpass_entry.get()
if masterpass != masterpassword:
attempts -= 1
if attempts == 0:
sys.exit()
else:
on_click()
else:
break
add_window.mainloop()`
我正在尝试制作一个密码管理器,但它卡在了这段代码上。
我期待它询问我的主密码,如果错误,它会给我一个警告,说你还剩一些尝试次数。相反,它只是给我连续 5 条警告消息,然后就关闭了。为什么会出现这种情况?
在您的代码中,
masterpass
变量不会在循环内更新,因此它始终检查初始空字符串。此外, get()
方法会在调用时检索条目小部件的内容,而不是在用户键入时动态检索。
我修改如下:
import tkinter as tk
from tkinter import messagebox
import sys
def masterpassgui(password):
masterpassword = password
add_window = tk.Tk()
add_window.title("Master Password")
add_window.geometry("250x250")
masterpass_label = tk.Label(add_window, text="Enter your master password:")
masterpass_label.grid(row=0, column=0, sticky="w")
masterpass_entry = tk.Entry(add_window)
masterpass_entry.grid(row=0, column=1)
attempts = 5
def on_click():
messagebox.showwarning(f"You have {attempts} attempts left. After that, it will lock down.")
def check_password():
nonlocal attempts
masterpass = masterpass_entry.get()
if masterpass != masterpassword:
attempts -= 1
if attempts == 0:
sys.exit()
else:
on_click()
else:
add_window.destroy()
submit_button = tk.Button(add_window, text="Submit", command=check_password)
submit_button.grid(row=1, columnspan=2)
add_window.mainloop()
# Example usage
masterpassgui("your_master_password")