ランダムなパスワード生成!TkinterでGUIアプリを作成しよう

ランダムなパスワード生成!TkinterでGUIアプリを作成しよう

本記事では、当サイト内で学んできたPythonのGUIライブラリであるTkinterを使い、randomstringを活用したパスワード生成アプリの開発を行います。これまで学んできた知識を活かし、実際に動作するアプリを作成することで、より深い理解を目指します。コードの解説を通じて、ランダムなパスワード生成の仕組みや、GUIアプリの作成方法について整理していきます。

ランダムなパスワード生成とは

ランダムなパスワード生成とは、コンピュータを使って予測不可能な文字列を自動的に作成することです。これにより、強固なパスワードを簡単に作成でき、セキュリティを高めることができます。

パスワードの安全性は、使用する文字の種類や長さによって決まります。一般的に、以下のような要素を含めることで、より強固なパスワードを作成できます。

  • 英大文字(A〜Z)
  • 英小文字(a〜z)
  • 数字(0〜9)
  • 記号(@, #, $, %, など)

今回使用するモジュール

ランダムなパスワードを生成するために、以下のPython標準ライブラリを使用します。

  • random:ランダムな値を生成するモジュール
  • string:英数字や記号などの文字列操作を行うモジュール
  • tkinter:GUI(Graphical User Interface)を作成するためのモジュール

randomstringを組み合わせることで、指定された条件に基づいたランダムな文字列を作成できます。また、tkinterを活用してGUIアプリとして動作させることで、視覚的に分かりやすく、使いやすいツールを作成できます。

今回作成するパスワード生成アプリの概要

今回作成するアプリは、ユーザーが入力した条件に基づいてランダムなパスワードを生成するGUIアプリです。以下の機能を実装します。

  • パスワードの長さを指定:ユーザーが入力した文字数でパスワードを生成
  • オプション選択による条件設定:チェックボックスを使い、パスワードの要素を選択可能
    • 数字を含むパスワード:数値を含めるかどうかを選択
    • 先頭を大文字にするパスワード:先頭の文字を必ず英大文字にする
    • 記号を含むパスワード:特殊文字(@, #, $, % など)を含めるかどうかを選択
  • 生成されたパスワードをクリップボードにコピー:ボタンを押すだけでパスワードをコピーできる機能

ランダムなパスワードを生成する仕組み

Pythonでは、ランダムな値を生成するためのrandomモジュールを利用します。このモジュールを使うことで、特定の範囲内でランダムな文字を選び、組み合わせることができます。

以下のコードは、ランダムなパスワードを生成する基本的な処理です。

import random
import string

def generate_password(length=12):
    characters = string.ascii_letters + string.digits + string.punctuation
    return ''.join(random.choice(characters) for _ in range(length))

print(generate_password())

このコードを実行することで、文字数12の大文字,小文字,数字,記号を含むパスワードが生成されます。

ランダムなパスワードを生成する仕組み
実行結果

コードの解説

  • random.choice(characters):文字列charactersの中からランダムに1文字を選ぶ
  • string.ascii_letters:英大文字と英小文字を含む
  • string.digits:数字を含む
  • string.punctuation:記号を含む

Tkinterでランダムパスワード生成アプリを作成

ここからは、Tkinterを使ってランダムなパスワードを生成するGUIアプリを作成します。ユーザーが指定した条件に応じて、適切なパスワードを生成する仕組みを実装します。

パスワード生成アプリのコード

import tkinter as tk
import random
import string

def generate_password():
    if not length_entry.get().isdigit():
        result_label.config(text="数字を入力してください")
        return
    length = int(length_entry.get())
    include_digits = digits_var.get()
    include_symbols = symbols_var.get()
    capitalize_first = capitalize_var.get()
    
    characters = string.ascii_lowercase
    if include_digits:
        characters += string.digits
    if include_symbols:
        characters += string.punctuation
    
    password = ''.join(random.choice(characters) for _ in range(length))
    
    if capitalize_first and password:
        password = random.choice(string.ascii_uppercase) + password[1:]
    
    result_label.config(text=password)

def copy_to_clipboard():
    root.clipboard_clear()
    root.clipboard_append(result_label.cget("text"))
    root.update()

# メインウィンドウの作成
root = tk.Tk()
root.geometry("500x500")
root.title("ランダムパスワード生成アプリ")

# UI要素の作成
length_label = tk.Label(root, text="パスワードの長さ:")
length_label.pack(pady=5)
length_entry = tk.Entry(root, validate='key', validatecommand=(root.register(lambda P: P.isdigit() or P == ""), '%P'))
length_entry.pack(pady=5)

digits_var = tk.BooleanVar()
symbols_var = tk.BooleanVar()
capitalize_var = tk.BooleanVar()

digits_check = tk.Checkbutton(root, text="数字を含める", variable=digits_var)
digits_check.pack(pady=5)

symbols_check = tk.Checkbutton(root, text="記号を含める", variable=symbols_var)
symbols_check.pack(pady=5)

capitalize_check = tk.Checkbutton(root, text="先頭を大文字にする", variable=capitalize_var)
capitalize_check.pack(pady=5)

generate_button = tk.Button(root, text="生成", command=generate_password)
generate_button.pack(pady=10)

copy_button = tk.Button(root, text="コピー", command=copy_to_clipboard)
copy_button.pack(pady=10)

result_label = tk.Label(root, text="")
result_label.pack(pady=20)

# アプリの実行
root.mainloop()

プログラムの概要

本アプリは以下の機能を持っています:

  • パスワードの長さを指定 できる
  • 数字や記号の有無を選択 できる
  • 先頭を大文字にするオプション を用意
  • 生成したパスワードを表示
  • コピー機能付き

コードの解説

必要なライブラリのインポート

import tkinter as tk
import random
import string
  • tkinter はGUI(グラフィカルユーザーインターフェース)を作成するためのライブラリ
  • random はランダムな値を生成するために使用
  • string は英字・数字・記号などの文字列を扱うために使用

パスワード生成関数

def generate_password():
    if not length_entry.get().isdigit():
        result_label.config(text="数字を入力してください")
        return
    length = int(length_entry.get())
    include_digits = digits_var.get()
    include_symbols = symbols_var.get()
    capitalize_first = capitalize_var.get()
    
    characters = string.ascii_lowercase
    if include_digits:
        characters += string.digits
    if include_symbols:
        characters += string.punctuation
    
    password = ''.join(random.choice(characters) for _ in range(length))
    
    if capitalize_first and password:
        password = random.choice(string.ascii_uppercase) + password[1:]
    
    result_label.config(text=password)
  1. length_entry.get() から取得した値を整数に変換してパスワードの長さを決定
    数値が入力されない状態で生成ボタンを押されたら「数字を入力してください」を出力
  2. チェックボックスの状態に応じて 数字記号 を含めるか選択
  3. 指定された文字種の中からランダムに選び、指定された長さのパスワードを作成
  4. 先頭を大文字にするオプション が有効なら、最初の文字を大文字に変更
  5. result_label.config(text=password) で生成したパスワードをラベルに表示

クリップボードにコピーする関数

def copy_to_clipboard():
    root.clipboard_clear()
    root.clipboard_append(result_label.cget("text"))
    root.update()
  • clipboard_clear() でクリップボードをクリア
  • clipboard_append() で生成したパスワードをクリップボードに追加
  • update() を実行してクリップボードの更新を確定

メインウィンドウの作成

root = tk.Tk()
root.geometry("500x500")
root.title("ランダムパスワード生成アプリ")
  • tk.Tk() でウィンドウを作成
  • geometry("500x500") でウィンドウサイズを指定
  • title("ランダムパスワード生成アプリ") でタイトルを設定

各UI要素の作成

length_label = tk.Label(root, text="パスワードの長さ:")
length_label.pack(pady=5)
length_entry = tk.Entry(root, validate='key', validatecommand=(root.register(lambda P: P.isdigit() or P == ""), '%P'))
length_entry.pack(pady=5)
  • Label でテキスト表示
  • Entry で数値入力を受け付ける(数値以外の入力を防止)

オプション選択のチェックボックス

digits_var = tk.BooleanVar()
symbols_var = tk.BooleanVar()
capitalize_var = tk.BooleanVar()

digits_check = tk.Checkbutton(root, text="数字を含める", variable=digits_var)
digits_check.pack(pady=5)

symbols_check = tk.Checkbutton(root, text="記号を含める", variable=symbols_var)
symbols_check.pack(pady=5)

capitalize_check = tk.Checkbutton(root, text="先頭を大文字にする", variable=capitalize_var)
capitalize_check.pack(pady=5)
  • BooleanVar() を使って、チェックボックスの状態を管理
  • 各チェックボックスを作成し、ウィンドウに配置

ボタンと結果表示

generate_button = tk.Button(root, text="生成", command=generate_password)
generate_button.pack(pady=10)

copy_button = tk.Button(root, text="コピー", command=copy_to_clipboard)
copy_button.pack(pady=10)

result_label = tk.Label(root, text="")
result_label.pack(pady=20)
  • Button を作成し、クリック時に関数を実行
  • Label でパスワードを表示

アプリの実行

root.mainloop()
  • mainloop() でウィンドウを開き、ユーザーの操作を受け付ける

まとめ

このプログラムでは、Tkinter を用いてシンプルなランダムパスワード生成アプリを作成しました。パスワードの長さや文字種の選択、コピー機能 など、実用的な機能を備えています。カスタマイズも容易なので、より複雑なパスワード生成機能を追加することも可能です。

例えば:

  • パスワードの強度評価(簡単・普通・強力など)
  • 特定の記号を除外する機能
  • クリップボードにコピーした際に通知を表示する

などの機能を追加すると、さらに便利なアプリになります。興味があればぜひ試してみてください!

ABOUT US
AI
YUKI
HAL東京を卒業後、IT関係のベンチャー企業に就職。 現在は、家業の跡取りとして商売をやりながらITの知識を活かした取り組みを行っています。