2023年9月26日 星期二

密碼管理器 tk


 

首先第一步設定UI

import tkinter as tk
from tkinter import messagebox
import pyperclip
import json
window = tk.Tk()
window.title('密碼管理器')
window.config(padx=50, pady=50)



背景部分 要先讀取圖片 建立圖片物件

然設定畫布物件, 在新增畫布物件中的圖片屬性

# ------------UI
# 讀取圖片建立畫布
image_obj = tk.PhotoImage(
    file='logo.png')
# 建立畫布物件,設定長寬
canvas_obj = tk.Canvas(width=200, height=190)
canvas_obj.create_image(100, 145, image=image_obj)
canvas_obj.grid(row=0, column=1)

設定欄位

網站: _______    搜索

信箱: _____________

密碼:__________亂數產生密碼

            建立/新增到json檔


Web_lab = tk.Label(text='Website:')
Web_lab.grid(row=1, column=0)
Web_Entry = tk.Entry(width=30)
Web_Entry.grid(row=1, column=1, sticky='w', columnspan=2)
# 預設光標的起始點
Web_Entry.focus()

Web_sear_but = tk.Button(text='search', width=8, command=check_web)
Web_sear_but.grid(row=1, column=2)


Email_Label = tk.Label(text='Email/Username:')
Email_Label.grid(row=2, column=0)
Email_Entry = tk.Entry(width=40)
Email_Entry.insert(0, string='example@google.com')
Email_Entry.grid(row=2, column=1, sticky='w', columnspan=2)

Pwd_Label = tk.Label(text='Password:')
Pwd_Label.grid(row=3, column=0)
Pwd_entry = tk.Entry(width=30)
Pwd_entry.grid(row=3, column=1, sticky='w')


Pwd_but = tk.Button(text='密碼產生器', width=8, command=genactor_pwd)
Pwd_but.grid(row=3, column=2)

creat_but = tk.Button(text='建立/新增', width=39, command=data_to_txt)
creat_but.grid(row=4, column=1, columnspan=2)


window.mainloop()



---------------賦予按鈕功能

#檢查是否已經註冊過


def check_web():
    '檢查是否已經註冊過該網站'
    try:
        website = Web_Entry.get()
        with open('密碼管理本.json', 'r')as file:
            data = json.load(file)

    except FileNotFoundError:
        print(f'目前資料庫內無該用戶')
        messagebox.showinfo(
            title='沒有json檔', message='資料庫不存在')

    else:
        if website in data:
            '找到囉'
            print(data)
            messagebox.showinfo(
                title=website, message=f'email:{data[website]["eamil"]}\nPwd:{data[website]["Pwd"]}')

        else:
            messagebox.showinfo(
                title='pass', message=f'不在資料庫中')





#定義建立資料的部分

# 定義案件功能
def data_to_txt():
    '生成文本存取密碼到json'
    res = []
    res_dict = {}
    Web = Web_Entry.get()
    print(f'取得輸入網站:{Web}')

    User = Email_Entry.get()
    print(f'取得輸入用戶:{User}')

    Pwd = Pwd_entry.get()
    print(f'取得輸入密碼:{Pwd}')
    # 檢查資料是否留白
    if len(Web) == 0 or len(User) == 0 or len(Pwd) == 0:
        messagebox.showinfo(title='警告', message='檢查資料是否留白')
    else:

        res_dict['Web'] = Web
        res_dict['User'] = User
        res_dict['Pwd'] = Pwd
        # 轉json格式
        res.append(res_dict)
        json_dict = {
            Web: {'eamil': User, 'Pwd': Pwd}
        }

        Is_ok = messagebox.askokcancel(title='確認使否存取以下資訊', message=f"""
    即將存取以下資料:\n網站:{Web}\nUser={User}\nPwd={Pwd}""")
        if Is_ok:
            '如果沒有資料會拋出例外'
            try:
                with open('密碼管理本.json', 'r')as file:
                    # 讀取old data
                    data = json.load(file)
                    print(f'現有資料:={data}')
                    # 更新目前資料

            except FileNotFoundError:
                print(f'目前密碼管理本還不存在,直接建立')
                data = json_dict
                with open('密碼管理本.json', 'w')as file:

                    json.dump(data, file, indent=4)

            except Exception as e:
                print(f'有趣, 這個例外我沒想到{e}')

            else:
                '正常執行時,更新現有data,再重新寫入'
                data.update(json_dict)
                with open('密碼管理本.json', 'w')as file:
                    # 再重新寫入
                    json.dump(data, file, indent=4)
                    print(f'更新資料={data}')
            finally:
                '無論如何都要執行區'

                Web_Entry.delete(0, tk.END)
                # Email_Entry.delete(0,tk.END)
                Pwd_entry.delete(0, tk.END)


#定義亂數產生密碼的部分



def genactor_pwd():
    import random
    '亂數產生密碼,亂數產生8-12位密碼'
    symbol = list("!@#$%^&^&*")
    pwd_source = list('abcdefghijklmnopqurtuvwxyz0123456789')
    pwd_source.extend(symbol)
    num = random.randint(8, 12)
    print(f'產生密碼有{num}個')
    pwd_data = random.choices(pwd_source, k=num)
    pwd_data_str = ''.join(pwd_data)
    # 複製產生的密碼
    pyperclip.copy(pwd_data_str)

    print(f'產生的密碼為{pwd_data_str}')
    # 顯示在欄位上
    Pwd_entry.delete(0, tk.END)  # 刪除從0到末尾的文本
    Pwd_entry.insert(0, string=pwd_data_str)

























































標籤:

0 個意見:

張貼留言

訂閱 張貼留言 [Atom]

<< 首頁