파이썬/파이썬(python) 중급

[29-2 파이썬] tkinter 패스워드 매니저 만들기

Olivia-BlackCherry 2022. 9. 18. 09:38

tkinter를 이용해서 웹사이트, 아이디, 비밀번호를 저장하여 

필요할 때마다 확인할 수 있는

나만의 패스워드 매니저를 만들어보자.

1. tkinter기본 window만들기

mainloop() : 화면 꺼지지 않고, 계속 작동하도록 하기

from tkinter import *
window = Tk()
window.mainloop()

2. 제목: my password manager

title() : 화면 창 맨 위, 바에 제목 적기

window.title("my password manager")

3. 캔버스 만들기, 가로:200, 높이:200

Canvas(width, height) : 캔버스 클래스 놓기. 안에 여러 컴포넌트를 놓을 수 있으며, 폭과 높이를 지정하기

canvas = Canvas(width=200, height=200)

4. 사진 가져오기 , 중앙에 배치하기

PhotoImage(file) : 이미지 파일 가져오기

create_image(x, y, image) : 캔버스에 이미지 놓기, x,y 위치를 정하고, 놓일 image 적기

picture = PhotoImage(file = "paswd.png")
canvas.create_image(100, 90, image=picture)

5. 여백 20씩 주기

 상황에 맞게 여백 조절하기

window.config(padx=20, pady=20)

6. 윈도우 배경색깔 주기

config(bg) : 배경색깔 주기

window.config(padx=20, pady=20, bg="white")

7. 사진 배경색깔 주기

Canvas(bg) : canvas 생성될 때 배경색깔 주기

canvas = Canvas(width=200, height=200, bg= "white")

8. 경계 없애기

highlightthickness=0 : 사진과 윈도우 경계 없애기

canvas = Canvas(width=200, height=200, bg= "white", highlightthickness=0)

9. 사진크기 1/2로 줄이기

subsample(x, y) : 사진 크기 줄이기

<-> zoom(x, y) : 사진 크기 늘이기

picture = picture.subsample(2,2)

 

 

 

10. 컴포넌트 생성하기, 레이아웃 배치하기

Label, Entry, Button 클래스로 컴포넌트 생성하고, 

grid(row, column, columnspan)으로 레이아웃 배치하기

canvas = Canvas(width=200, height=200, bg= "white", highlightthickness=0)
picture = PhotoImage(file = "paswd.png")
picture = picture.subsample(2,2)
canvas.create_image(100, 90, image=picture)
canvas.grid(row=0, column=1)

website = Label(text="website", font=("Courier", 10, "bold"))
website.grid(row= 1, column=0)

website_input= Entry(width=40)
website_input.grid(row=1, column=1, columnspan=2)

email_username = Label(text="Email/Username", font=("Courier", 10, "bold"))
email_username.grid(row= 2, column=0)

email_username_input= Entry(width=40)
email_username_input.grid(row=2, column=1, columnspan=2)

password = Label(text="password", font=("Courier", 10, "bold"))
password.grid(row= 3, column=0)

password_input=Entry(width=24)
password_input.grid(row=3, column=1)

generate_password = Button(text="Generate Password", width=15)
generate_password.grid(row=3, column=2)

add = Button(text="Add", width=40)
add.grid(row=4, column=1, columnspan=2)

 

 

 

11. 라벨 배경 흰색으로 바꾸기

Label(bg) :라벨 배경 색깔 바꾸기

website = Label(text="website", font=("Courier", 10, "bold"), bg="white")
email_username = Label(text="Email/Username", font=("Courier", 10, "bold"), bg="white")
password = Label(text="password", font=("Courier", 10, "bold"), bg="white")

 

 

 

12. 패딩 조절하기

config(padx, pady) : 해당 길이로 여백주기

window.config(padx=50, pady=50, bg="white")

 

 

13. 커서 놓기

focus() 내가 원하는 위치에 커서 자동으로 놓기

website_input.focus()

14. 기본값 문자 설정하기

insert(index, string) : 해당  index에 string 삽입하기

email_username_input.insert(0, "olivia@coding.co.kr")

 

 

 

15. 입력값 받기

get() : 입력한 값을 받는다.

save_website = website_input.get()
save_email= email_username_input.get()
save_password = password_input.get()

16. 입력한 값을 파일에 저장

with open(file=파일경로, mode=a) as 이름:

데이터를 해당 file에 이어쓰기하여 저장한다.

def save_data():
    save_website = website_input.get()
    save_email= email_username_input.get()
    save_password = password_input.get()
    save_all = save_website + " | " + save_email +" | " + save_password
    with open(file="data.txt", mode="a") as f:
        f.write(save_all + "\n")

17. add버튼을 누르면 실행

command: 버튼을 눌렀을 때 실행되는 함수

add = Button(text="Add", width=40, command=save_data)

 

 

 

18. 저장되었다면, 글상자에 적은 데이터는 지우기

delete(start, end) : start index부터  end index까지 삭제되며,  전부를 삭제하고 싶다면 (0, END)를 쓴다.

website_input.delete(0, END)
email_username_input.delete(0, END)
password_input.delete(0, END)

 

19. 메시지 박스 열기

from tkinter import messagebox

1) 정보 보여주기

messagebox.showinfo(title="Title", message="message")

 

2) Yes or No 묻기

messagebox.askyesno(title="Title", message="message")

 

3) Ok or Cancel 묻기

messagebox.askokcancel(title="Title", message="message")

messagebox.askokcancel(title= save_website, message=f"이대로 저장해도 될까요?\n{save_all}")

 

 

20. 에러 메시지 박스 열기

if len(save_website)<1 or len(save_email)<1 or len(save_password)<1:
    messagebox.showerror(title="에러", message="입력한 값이 너무 짧습니다")

else:
    with open(file="data.txt", mode="a") as f:
        f.write(save_all + "\n")
    website_input.delete(0, END)
    email_username_input.delete(0, END)
    password_input.delete(0, END)

 

 

21. 입력 정보 확인 메시지 박스 열기

if len(save_website)<1 or len(save_email)<1 or len(save_password)<1:
    messagebox.showerror(title="에러", message="입력한 값이 너무 짧습니다")

else:
    is_ok = messagebox.askokcancel(title= save_website, message=f"이대로 저장해도 될까요?\n{save_all}")
    if is_ok:
        with open(file="data.txt", mode="a") as f:
            f.write(save_all + "\n")
        website_input.delete(0, END)
        email_username_input.delete(0, END)
        password_input.delete(0, END)

 

 

22. 패스워드 생성기 만들기

1) random 함수를 이용한다. 

random.randint(a, b) : a부터 b까지의 숫자 중 하나를 선택하기

random.choice(list) : list에서 하나를 선택하기

random.shuffle(list) : list를 무작위로 섞기

 

2) join 메소드를 이용한다.

a.join(list) : list에 있는 요소를 a를 사잇돌로 두고 합쳐 string타입으로 출력한다.

예를 들어

'#'.join(['a','b','c'])

>> a#b#c

 

3) insert(index, string)

index자리에 string을 넣는다.

import random
def safe_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)

    letters_list = [random.choice(letters) for char in range(nr_letters)]
    symbols_list = [random.choice(symbols) for char in range(nr_symbols)]
    numbers_list = [random.choice(numbers) for char in range(nr_numbers)]

    password_list= letters_list + symbols_list + numbers_list
    random.shuffle(password_list)

    password = ''.join(password_list)

    password_input.insert(0,password)

 

 

23. 패스워드 자동 복사하기

pyperclip 모듈을 이용한다.

- 복사하기 pyperclip.copy()

- 붙여넣기 pyperclip.paste()

import pyperclip
pyperclip.copy(password)

 

 

<최종코드>

from tkinter import *
from tkinter import messagebox
import random
import pyperclip

print('#'.join(['a','b','c']))
# ---------------------------- PASSWORD GENERATOR ------------------------------- #
def safe_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)

    letters_list = [random.choice(letters) for char in range(nr_letters)]
    symbols_list = [random.choice(symbols) for char in range(nr_symbols)]
    numbers_list = [random.choice(numbers) for char in range(nr_numbers)]

    password_list= letters_list + symbols_list + numbers_list
    random.shuffle(password_list)

    password = ''.join(password_list)

    password_input.insert(0,password)

    pyperclip.copy(password)
# ---------------------------- SAVE PASSWORD ------------------------------- #
def save_data():
    save_website = website_input.get()
    save_email= email_username_input.get()
    save_password = password_input.get()
    save_all = save_website + " | " + save_email +" | " + save_password

    if len(save_website)<1 or len(save_email)<1 or len(save_password)<1:
        messagebox.showerror(title="에러", message="입력한 값이 너무 짧습니다")

    else:
        is_ok = messagebox.askokcancel(title= save_website, message=f"이대로 저장해도 될까요?\n{save_all}")
        if is_ok:
            with open(file="data.txt", mode="a") as f:
                f.write(save_all + "\n")
            website_input.delete(0, END)
            email_username_input.delete(0, END)
            password_input.delete(0, END)


# ---------------------------- UI SETUP ------------------------------- #
window = Tk()
window.config(padx=50, pady=50, bg="white")
window.title("my password manager")


canvas = Canvas(width=200, height=200, bg= "white", highlightthickness=0)
picture = PhotoImage(file = "paswd.png")
picture = picture.subsample(2,2)
canvas.create_image(100, 90, image=picture)
canvas.grid(row=0, column=1)

#Label
website = Label(text="website", font=("Courier", 10, "bold"), bg="white")
website.grid(row= 1, column=0)
email_username = Label(text="Email/Username", font=("Courier", 10, "bold"), bg="white")
email_username.grid(row= 2, column=0)
password = Label(text="password", font=("Courier", 10, "bold"), bg="white")
password.grid(row= 3, column=0)


#Entry
website_input= Entry(width=40)
website_input.grid(row=1, column=1, columnspan=2)
website_input.focus()

email_username_input= Entry(width=40)
email_username_input.grid(row=2, column=1, columnspan=2)
email_username_input.insert(0, "olivia@coding.co.kr")

password_input=Entry(width=24)
password_input.grid(row=3, column=1)


#Button
generate_password = Button(text="Generate Password", width=15, command=safe_password)
generate_password.grid(row=3, column=2)
add = Button(text="Add", width=40, command=save_data)
add.grid(row=4, column=1, columnspan=2)

window.mainloop()