Hướng dẫn python password manager gui - hướng dẫn quản lý mật khẩu python

Tkinter, Python sườn de facto tiêu chuẩn GUI

Động lực

Tôi đã từng có một mật khẩu duy nhất cho mọi thứ cho đến khi tôi học được những điều khó khăn. Vì vậy, tôi bắt đầu tạo ra mật khẩu phức tạp hơn và bản năng thượng cổ của tôi đã dạy tôi lưu chúng ở đâu đó. Trước khi bạn cho dù lưu trữ mật khẩu không được mã hóa cục bộ là một tội ác ghê tởm, xin vui lòng biết rằng tôi vẫn sẽ tiến hành bài đăng này.

Bắt đầu với kết thúc trong tâm trí

Xây dựng UI

Đây là phần dễ dàng.

root = Tk()
root.title(“Password Manager”)
root.config(padx=50, pady=50, bg=NAVY)
# insert widgets hereroot.mainloop()

Tiện ích Canvas

# ROW 0
canvas = Canvas(height=200, width=200, bg=NAVY, highlightthickness=0)
img = PhotoImage(file='logo.png')
canvas.create_image(100, 100, image=img)
canvas.grid(row=0,column=1)

Các vật dụng khác

Điều đáng chú ý trong mã dưới đây là nó không phải là một ý tưởng tuyệt vời để mã hóa chiều rộng tiện ích vì có quá nhiều thử nghiệm và lỗi. Một cách tốt hơn sẽ là sử dụng tham số sticky.

Lưu ý rằng có 3 tiện ích nút được liên kết với search_website, Random_password và Saving_entries bằng cách sử dụng command Param mà chúng tôi sẽ xây dựng trong phần sau.

# ROW 1
website_label = Label(text=’Website:’, bg=NAVY, fg=BEIGE)
website_label.grid(row=1,column=0,sticky=”W”)
website_entry = Entry()
website_entry.grid(row=1,column=1, columnspan=2,sticky=”EW”)
website_entry.focus()
website_search = Button(text='Search', bg=GREY, command=search_website)
website_search.grid(row=1,column=2,sticky="EW")
# ROW 2
email_label = Label(text=’Email/Username:’, bg=NAVY, fg=BEIGE)
email_label.grid(row=2,column=0,sticky=”W”)
email_entry = Entry()
email_entry.grid(row=2,column=1, columnspan=2,sticky=”EW”)
email_entry.insert(0, ‘’)
# ROW 3
password_label = Label(text=’Password:’, bg=NAVY, fg=BEIGE)
password_label.grid(row=3,column=0,sticky=”W”)
password_entry = Entry()
password_entry.grid(row=3,column=1,sticky=”EW”)
password_button = Button(text=’Generate Password’, bg=GREY, command=random_password)
password_button.grid(row=3,column=2,sticky=”EW”)
# ROW 4
button = Button(text=’Add’, bg=GREY, command=saved_entries)
button.grid(row=4,column=1,columnspan=2,sticky=”EW”)
button.config(pady=2)

Tạo chức năng để lưu vào tệp đầu ra

Chúng tôi bắt đầu bằng cách thu thập các đầu vào của người dùng trước khi tuần tự hóa thành định dạng JSON cụ thể.

def saved_entries():# GETTING THE USER INPUTS
user_website = website_entry.get()
user_email = email_entry.get()
user_password = password_entry.get()
new_data = {
user_website: {
'email': user_email,
'password': user_password
}
}
...

Trước khi chúng tôi lưu mục vào tệp JSON của chúng tôi, nó sẽ khôn ngoan để xác nhận nếu có bất kỳ trường hoặc lỗi chính tả nào. Do đó, chúng tôi đã nhập mô-đun messagebox về cơ bản chỉ là một cửa sổ bật lên.

Ở đây, một liên kết để làm việc với dữ liệu json là json.load (), json.update () và json.dump ()

def saved_entries():    if len(user_website) != 0 and len(user_password) != 0:        try:
## LOADING JSON FILE IF EXIST
with open('data.json', 'r') as data_file:
data = json.load(data_file)
data.update(new_data)

except FileNotFoundError:
## CREATE JSON FILE AND CREATE FIRST ENTRY IF DONT EXIST
with open('data.json','w') as data_file:
json.dump(new_data, data_file, indent=4)

else:
## CONFIRM DETAILS BEFORE DUMPING INTO JSON FILE
is_correct = messagebox.askyesno(
title=f"{user_website}",
message=f"\n'email': {user_email}\n
'password': {user_password}\n\n
Please confirm before saving!")
if is_correct:
with open('data.json','w') as data_file:
json.dump(data, data_file, indent=4)
website_entry.delete(0, END)
password_entry.delete(0, END)
else:
# IF WEBSITE OR EMAIL ENTRY IS BLANK
messagebox.showwarning(
title='Oops',
message="Please don't leave any fields empty!"
)

Tạo chức năng để tạo mật khẩu ngẫu nhiên

Chức năng cuối cùng có lẽ là dễ nhất. Điều duy nhất Tkinter-ish cần làm nổi bật ở đây là biết cách làm việc với mục nhập, đặc biệt là delete

# ROW 0
canvas = Canvas(height=200, width=200, bg=NAVY, highlightthickness=0)
img = PhotoImage(file='logo.png')
canvas.create_image(100, 100, image=img)
canvas.grid(row=0,column=1)
0.

Để trải nghiệm người dùng tốt hơn, mật khẩu được tạo cũng được tự động lưu vào bảng tạm bằng mô-đun

# ROW 0
canvas = Canvas(height=200, width=200, bg=NAVY, highlightthickness=0)
img = PhotoImage(file='logo.png')
canvas.create_image(100, 100, image=img)
canvas.grid(row=0,column=1)
1.

Lưu ý bên: “Làm thế nào để áp dụng một chức năng cho mọi mục trong danh sách” là thứ tôi thường googled

def random_password():letters = list(‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’)
numbers = list(‘0123456789’)
symbols = list(‘!@#$%^&*()_+’)
letters_lower = list(map(str.lower,letters))
letters.extend(letters_lower)
#Return a number between a and b (both included):
num_letters = random.randint(8,10)
num_numbers = random.randint(1,2)
num_symbols = random.randint(1,2)
# Creating password in one big list
rand_letters = [random.choice(letters) for i in range(num_letters)]
rand_numbers = [random.choice(numbers) for i in range(num_numbers)]
rand_symbols = [random.choice(symbols) for i in range(num_symbols)]
created_password = rand_letters + rand_numbers + rand_symbols# Shuffle the positions and join to create str
random.shuffle(created_password)
created_password = ‘’.join(created_password)
# Insert into password_entry label upon clicking “Generate password”
password_entry.delete(0, END)
password_entry.insert(0, created_password)
# Copy created password to clipboard
pyperclip.copy(created_password)

Sự kết luận

Mã đầy đủ có thể được tìm thấy ở đây: https://github.com/hxkoey/passwordmanager-tkinter