有没有一种方法可以让我的GUI密码管理器使用Python中的用户名和密码进行访问?

有没有一种方法可以让我的GUI密码管理器使用Python中的用户名和密码进行访问?,python,tkinter,Python,Tkinter,我使用Python制作了一个程序(密码管理器),我可以输入网站、电子邮件和密码,然后单击“添加”按钮将输入写入json文件,我对此没有问题,它工作正常,我想做的是,当我打开程序时,我想让它询问我的登录用户名和密码 更不用说,我已经创建了登录窗口,其中有两个标签,每个“用户名”和“密码”有两个条目,并且在下面添加了一个“回车”按钮,我还在第107行创建了一个名为“验证”的函数,并使用“command=validate”将其分配给“回车”按钮,我想不出一种方法来计算username.input.ge

我使用Python制作了一个程序(密码管理器),我可以输入网站、电子邮件和密码,然后单击“添加”按钮将输入写入json文件,我对此没有问题,它工作正常,我想做的是,当我打开程序时,我想让它询问我的登录用户名和密码

更不用说,我已经创建了登录窗口,其中有两个标签,每个“用户名”和“密码”有两个条目,并且在下面添加了一个“回车”按钮,我还在第107行创建了一个名为“验证”的函数,并使用“command=validate”将其分配给“回车”按钮,我想不出一种方法来计算username.input.get()=“username”和password.input.get()=“password”我的程序何时应该打开,这个登录窗口何时应该关闭

我已经搜索了很多,但我找不到任何可以在我的代码中使用的东西

这是我的密码:

from tkinter import *
from tkinter import messagebox
import random
import pyperclip
import json
# --------------------------------- Password Generator ---------------------------------- #
# Password Generator Project

def generate_password():
    letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']

    nr_letters = random.randint(8, 10)
    nr_symbols = random.randint(2, 4)
    nr_numbers = random.randint(2, 4)

    password_list = []


    password_letters = [random.choice(letters) for _ in range(nr_letters)]

    password_symbols = [random.choice(symbols) for _ in range(nr_symbols)]

    password_numbers = [random.choice(numbers) for _ in range(nr_numbers)]
    password_list = password_letters + password_symbols + password_numbers
    random.shuffle(password_list)


    password = "".join(password_list)
    password_input.insert(0, password)
    pyperclip.copy(password)
# --------------------------------- Save Passwords ---------------------------------- #
def save():
    website = website_input.get()
    email = email_input.get()
    password = password_input.get()

    new_data = {

        website: {
            "email": email,
            "password": password,

        }

                }

    if len(website) == 0 or len(email) == 0 or len(password) == 0:
        messagebox.showinfo(title="Oops", message="Please don't leave any fields empty!")

    else:
        try:
            with open("data.json", "r") as file:

                # Reading old data
                data = json.load(file)

        except FileNotFoundError:
            with open("data.json", "w") as file:
                # Updating old data with new data
                json.dump(new_data, file, indent=4)
        else:
            data.update(new_data)

            with open("data.json", "w") as file:
                # Saving updated data
                json.dump(data, file, indent=4)
        finally:
            website_input.delete(0, END)
            email_input.delete(0, END)
            password_input.delete(0, END)
            website_input.focus()

# --------------------------------- Fine Password ---------------------------------- #

def find_password():

    website = website_input.get()
    try:
        with open("data.json") as file:
            data = json.load(file)

    except FileNotFoundError:
        messagebox.showinfo(title="Error", message="No data file found!")

    else:
        if website in data:
            email = data[website]["email"]
            password = data[website]["password"]
            messagebox.showinfo(title=website,message=f"Email: {email}\n\nPassword: {password}")
        else:
            messagebox.showinfo(title="Error", message=f"No details for {website} exists!")


# --------------------------------- UI Setup ---------------------------------- #


def validate():
    username = username_check_input.get()
    password = password_check_input.get()
    if username == "username" and password == "password":
        pass
    else:
        messagebox.showwarning(title="Error", message="Wrong password, try again!")
        username_check_input.delete(0, END)
        password_check_input.delete(0, END)



password_checker_window = Tk()
password_checker_window.title("Login to the password database")
password_checker_window.config(padx=50, pady=50, width=500, height=350, bg="#282120")

# canvas = Canvas(width=200, height=200, bg="#282120", highlightthickness=0)
# logo_image = PhotoImage(file="logo.png")
# canvas.create_image(100, 100, image=logo_image)
# canvas.grid(column=1, row=0)

username_check_label = Label(text="Username:", bg="#282120", fg="#D4483B")
username_check_label.grid(column=0, row=2)
password_check_label = Label(text="Password:", bg="#282120", fg="#D4483B")
password_check_label.grid(column=0, row=3)
space1 = Label(text=" ", bg="#282120")
space1.grid(column=1, row=1)

username_check_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
username_check_input.grid(column=1, row=2)
username_check_input.focus()
password_check_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B", show="*")
password_check_input.grid(column=1, row=3)
space2 = Label(text=" ", bg="#282120")
space2.grid(column=0, row=4)
enter_button = Button(text="Enter", width=7, bg="#282120", fg="#D4483B", command=validate)
enter_button.grid(column=1, row=5, columnspan=2)


while username_check_input.get() == "username" and password_check_input.get() == "password":

    window = Tk()
    window.title("Password Generator")
    window.config(padx=50, pady=50, bg="#282120")

    # canvas = Canvas(width=200, height=200, bg="#282120", highlightthickness=0)
    # logo_image = PhotoImage(file="logo.png")
    # canvas.create_image(100, 100, image=logo_image)
    # canvas.grid(column=1, row=0)

    # Labels
    website_label = Label(text="Website:", bg="#282120", fg="#D4483B")
    website_label.grid(column=0, row=2)
    email_label = Label(text="Email / Username:", bg="#282120", fg="#D4483B")
    email_label.grid(column=0, row=3)
    password_label = Label(text="Password:", bg="#282120", fg="#D4483B")
    password_label.grid(column=0, row=4)
    line_label1 = Label(text=" ", bg="#282120")
    line_label1.grid(column=1, row=1)
    line_label2 = Label(text=" ", bg="#282120")
    line_label2.grid(column=1, row=5)

    # Entries
    website_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
    website_input.grid(column=1, row=2)
    website_input.focus()
    email_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
    email_input.grid(column=1, row=3)
    # email_input.insert(0, "anything@gmail.com")
    password_input = Entry(width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
    password_input.grid(column=1, row=4)

    # Buttons
    generate_password_button = Button(text="Generate Password", bg="#282120", fg="#D4483B", command=generate_password)
    generate_password_button.grid(column=2, row=4)

    add_password = Button(text="Add", width=45, bg="#282120", fg="#D4483B", command=save)
    add_password.grid(column=1, row=6, columnspan=2)

    search = Button(text="Search", width=14, bg="#282120", fg="#D4483B", command=find_password)
    search.grid(column=2, row=2)

    window.mainloop()



password_checker_window.mainloop()

您可以隐藏登录窗口,添加
password\u checker\u window.destroy()
并将所有manager内容放入一个函数中,然后在验证登录后调用它,但这会产生另一个问题。密码管理器的变量现在是局部变量,因此如果没有大量全局变量,就无法从函数中访问它们。
为了解决这个问题,我将您的程序重新组织为两个类。这些函数已组织到它们的相关类中,现在可以访问变量。要了解有关类和tkinter的更多信息,请搜索“OOP tkinter”(它使大型程序更易于使用)。
我还修复了密码生成器的一个小错误,在插入新密码并添加到所有小部件的父级之前,旧密码不会被删除。

虽然这一切现在都起作用了,但我想看看Serge Ballesta评论中提到的一些安全措施,因为您的密码管理器目前非常不安全

# Class for login window
class loginWindow(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title("Login to the password database")
        self.config(padx=50, pady=50, width=500, height=350, bg="#282120")

        # canvas = Canvas(self, width=200, height=200, bg="#282120", highlightthickness=0)
        # logo_image = PhotoImage(file="logo.png")
        # canvas.create_image(100, 100, image=logo_image)
        # canvas.grid(column=1, row=0)

        self.username_check_label = Label(self, text="Username:", bg="#282120", fg="#D4483B")
        self.username_check_label.grid(column=0, row=2)
        self.password_check_label = Label(self, text="Password:", bg="#282120", fg="#D4483B")
        self.password_check_label.grid(column=0, row=3)
        self.space1 = Label(self, text=" ", bg="#282120")
        self.space1.grid(column=1, row=1)

        self.username_check_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
        self.username_check_input.grid(column=1, row=2)
        self.username_check_input.focus()
        self.password_check_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B", show="*")
        self.password_check_input.grid(column=1, row=3)
        self.space2 = Label(self, text=" ", bg="#282120")
        self.space2.grid(column=0, row=4)
        self.enter_button = Button(self, text="Enter", width=7, bg="#282120", fg="#D4483B", command=self.validate)
        self.enter_button.grid(column=1, row=5, columnspan=2)

    def validate(self):
        username = self.username_check_input.get()
        password = self.password_check_input.get()
        if username == "username" and password == "password":
            self.destroy()
            global load_manager
            load_manager()
        else:
            messagebox.showwarning(title="Error", message="Wrong password, try again!")
            self.username_check_input.delete(0, END)
            self.password_check_input.delete(0, END)

#This function loads the password manager after logging in.
def load_manager():
    app = managerWindow()
    app.mainloop()

# Class for managerWindow
class managerWindow(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title("Password Generator")
        self.config(padx=50, pady=50, bg="#282120")

        # self.canvas = Canvas(self, width=200, height=200, bg="#282120", highlightthickness=0)
        # self.logo_image = PhotoImage(file="logo.png")
        # self.canvas.create_image(100, 100, image=logo_image)
        # self.canvas.grid(column=1, row=0)

        # Labels
        self.website_label = Label(self, text="Website:", bg="#282120", fg="#D4483B")
        self.website_label.grid(column=0, row=2)
        self.email_label = Label(self, text="Email / Username:", bg="#282120", fg="#D4483B")
        self.email_label.grid(column=0, row=3)
        self.password_label = Label(self, text="Password:", bg="#282120", fg="#D4483B")
        self.password_label.grid(column=0, row=4)
        self.line_label1 = Label(self, text=" ", bg="#282120")
        self.line_label1.grid(column=1, row=1)
        self.line_label2 = Label(self, text=" ", bg="#282120")
        self.line_label2.grid(column=1, row=5)

        # Entries
        self.website_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
        self.website_input.grid(column=1, row=2)
        self.website_input.focus()
        self.email_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
        self.email_input.grid(column=1, row=3)
        # self.email_input.insert(0, "anything@gmail.com")
        self.password_input = Entry(self, width=32, bg="#282120", fg="#D4483B", insertbackground="#D4483B")
        self.password_input.grid(column=1, row=4)

        # Buttons
        self.generate_password_button = Button(self, text="Generate Password", bg="#282120", fg="#D4483B", command=self.generate_password)
        self.generate_password_button.grid(column=2, row=4)

        self.add_password = Button(self, text="Add", width=45, bg="#282120", fg="#D4483B", command=self.save)
        self.add_password.grid(column=1, row=6, columnspan=2)

        self.search = Button(self, text="Search", width=14, bg="#282120", fg="#D4483B", command=self.find_password)
        self.search.grid(column=2, row=2)
    def generate_password(self):
        letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
        numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']

        nr_letters = random.randint(8, 10)
        nr_symbols = random.randint(2, 4)
        nr_numbers = random.randint(2, 4)

        password_list = []


        password_letters = [random.choice(letters) for _ in range(nr_letters)]

        password_symbols = [random.choice(symbols) for _ in range(nr_symbols)]

        password_numbers = [random.choice(numbers) for _ in range(nr_numbers)]
        password_list = password_letters + password_symbols + password_numbers
        random.shuffle(password_list)


        password = "".join(password_list)
        self.password_input.delete(0,"end") #Clear the password input before inserting
        self.password_input.insert(0, password)
        pyperclip.copy(password)
    def save(self):
        website = self.website_input.get()
        email = self.email_input.get()
        password = self.password_input.get()

        new_data = {

            website: {
                "email": email,
                "password": password,

            }

                    }

        if len(website) == 0 or len(email) == 0 or len(password) == 0:
            messagebox.showinfo(title="Oops", message="Please don't leave any fields empty!")

        else:
            try:
                with open("data.json", "r") as file:

                    # Reading old data
                    data = json.load(file)

            except FileNotFoundError:
                with open("data.json", "w") as file:
                    # Updating old data with new data
                    json.dump(new_data, file, indent=4)
            else:
                data.update(new_data)

                with open("data.json", "w") as file:
                    # Saving updated data
                    json.dump(data, file, indent=4)
            finally:
                self.website_input.delete(0, END)
                self.email_input.delete(0, END)
                self.password_input.delete(0, END)
                self.website_input.focus()
    def find_password(self):
        website = self.website_input.get()
        try:
            with open("data.json") as file:
                data = json.load(file)

        except FileNotFoundError:
            messagebox.showinfo(title="Error", message="No data file found!")

        else:
            if website in data:
                email = data[website]["email"]
                password = data[website]["password"]
                messagebox.showinfo(title=website,message=f"Email: {email}\n\nPassword: {password}")
            else:
                messagebox.showinfo(title="Error", message=f"No details for {website} exists!")
app = loginWindow()
app.mainloop()

常见的方法是在一些持久性存储(这里可能是您的json文件)中设置密码哈希。在密码被验证之前,你应该一直被屏蔽在屏幕上。但是如果您想要最低限度的安全性,那么所有密码(或所有其他数据)都应该加密,并且应该使用用户密码(直接或不直接)来解密它们。还有一些工作…使用类的原因之一是为了摆脱
global
,避免使用它。