UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY29 tkinterを使ってパスワード管理・パスワード作成ツールを作成する!

DAY29の講座ではパスワード管理・ジェネレーター機能付のツールを

pythontkinterを使ってグラフィカルに作成します。

 

仕上げは上の画像のような感じ。

Udemyのとはほぼ同じだけど少し機能やコーディングは変えています。

 

パスワードツールの作成の流れはこんな感じ

  • 該当するウェブサイトの入力欄
  • ログインするユーザー名・またはメールアドレスの入力欄
  • パスワードの入力欄
  • 英数字・記号をミックスさせたジェネレータツール
  • 全てを入力すると、csvに情報を追加して管理

保管したデータを検索・引き出す機能は後日でてくるので、

今回はここまでの機能を実装します。

 

tkinterGUIをレイアウト

 

まずは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を使うとシンプルなコーディングができそうだったので採用しました。

 

参考記事

qiita.com

 

 


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はこちら。

github.com