DAY29の講座ではパスワード管理・ジェネレーター機能付のツールを
pythonのtkinterを使ってグラフィカルに作成します。
仕上げは上の画像のような感じ。
Udemyのとはほぼ同じだけど少し機能やコーディングは変えています。
パスワードツールの作成の流れはこんな感じ
保管したデータを検索・引き出す機能は後日でてくるので、
今回はここまでの機能を実装します。
tkinterでGUIをレイアウト
まずはCanvas、Label、Entry、Buttonを使ってgridでレイアウトしていきます。
tkinterの基本的な部分で今までやっているので説明は割愛。
from tkinter import *
window = Tk()
window.minsize(width=300, height=300)
window.config(pady=50, padx=50)
window.title("Password Keeper")
canvas = Canvas(width=400, height=270)
pass_img = PhotoImage(file="logo.png")
bc_image = canvas.create_image(200,120, image=pass_img)
canvas.grid(row=0, column=0, columnspan=3)
website_area = Label(text="website", font=("Futura", 15, "italic"),anchor="w")
website_area.grid(row=1, column=0)
website_input = Entry(textvariable="website url", width=40)
website_input.grid(row=1, column=1, columnspan=2, sticky="w")
user_area = Label(text="user/email", font=("Futura", 15, "italic"),anchor="w")
user_area.grid(row=2, column=0)
user_input = Entry(textvariable="user", width=40)
user_input.grid(row=2, column=1, columnspan=2, sticky="w")
pass_area = Label(text="password", font=("Futura", 15, "italic"),anchor="w")
pass_area.grid(row=3, column=0)
pass_gen_btn = Button(text="generate", command=gen_pass)
pass_gen_btn.grid(row=3, column=2, sticky="w")
pass_input = Entry(width=25)
pass_input.grid(row=3, column=1, sticky="w")
add_btn = Button(text="add", command=pass_add)
add_btn.config(width=37)
add_btn.grid(row=4, column=1, columnspan=2, pady=5)
website_input.focus()
window.mainloop()
1つだけ説明するなら、最後のwebsite_input.focus()
これは起動した時にマウスがウェブサイトの入力部分をクリックされている状態にしています。
レイアウトはできたので、generateボタンをクリックした時に起動するgen_passと
addボタンをクリックした時に起動するpass_addをコーディングしていきます。
パスワードジェネレータの実装
強力なパスワードを作るために、
・ランダムで7~10個のアルファベット
・ランダムで3〜6個の数字
・ランダムで3〜5個の記号
を含めたパスワードを生成します。
ランダムで文字を抽出するのは、randomとstringを使うとシンプルなコーディングができそうだったので採用しました。
参考記事
import random
import string
def gen_pass():
gened_str = random.choices(string.ascii_letters, k=random.randint(7,10))
gened_num = random.choices(string.digits, k=random.randint(3,6))
gened_kigou = random.choices(string.punctuation, k=random.randint(3, 5))
gened_pass = gened_str + gened_kigou + gened_num
random.shuffle(gened_pass)
pass_input.delete(0, END)
pass_input.insert(END, "".join(gened_pass))
random.choicesで複数を選んでリストにしています。またkは回数を指定でき、randintでランダムな回数で取得しています。
今回はアルファベット・数字・記号それぞれで取得する回数を分けているので
それぞれに変数をつけて、最後にgened_passでリストをまとめています。
まとめたリストをshuffleすることでアルファベット・数字・記号の順番だったものをさらにランダムに配置しなおした上で入力欄にアウトプットしています。
また、パスワードのやり直しができるように.insertの前に一旦クリアするために
.deleteを挟んでいます。(はさまないとパスワード文字がどんどん増えていく)
情報をcsvに保存する
入力したサイト名・ユーザー名・パスワードをaddボタンを押して保存させます。
保存する前にどれかが入力がかけていたら「全部入力してください」というアラートを
出すようにします。
アラートを出すにはtkinter の messagebox をインポートします。
from tkinter import * ではインポートできないようです。。
また、csvに保存するのでcsvモジュールもインポートします。
import csv
from tkinter import messagebox
def pass_add():
website = website_input.get()
user = user_input.get()
password = pass_input.get()
if website == "" or user == "" or password =="":
messagebox.showinfo("Alert", "Fill All Input!")
else:
with open("pass_list.csv", mode="a") as data:
writer = csv.writer(data)
writer.writerow([website, user, password])
messagebox.showinfo("Alert", "Password Added!")
website_input.delete(0, END)
pass_input.delete(0, END)
user_input.delete(0, END)
website_input.focus()
取得したいinputの変数.get()で入力したテキストを取得できます。
if文では入力欄が空の時にmessagebox.showinfoでアラートを出します。
全部入力された時だけwriterowでそれぞれを1行でcsvに保存しています。
最初の保存ではcsvはありませんが自動生成されます。
保存し終わったら全ての入力欄をクリアして最初のウェブサイトの入力欄が
クリックされている状態に戻します。
これで今回のツール作成は終了!
Gitはこちら。