PythonでQRコード作成アプリを作る

投稿日: 2024年2月18日

QRコードを作成したいが自前で作成するにはどうすればいいのか分からないという話がありました。しかし大丈夫です。
PythonでPySimpleGUIを使用してQRコードを生成するアプリを作成することができます。

アプリケーションを作成するためには、まずPySimpleGUIとQRコードを生成するためのライブラリをインストールする必要があります。

ステップ 1: ライブラリをインストール

pip install PySimpleGUI
pip install qrcode
pip install Pillow

上記はターミナルのインストール方法ですがAnacondaでは「PySimpleGUI」、「qrcode」、「Pillow」各ライブラリ名で入れてください。

ステップ 2: インポート

import PySimpleGUI as sg
import qrcode
from PIL import ImageTk
import io
  • PySimpleGUI: シンプルで直感的なGUIを簡単に作成することができるライブラリです。
  • qrcode: QRコードを生成するためのライブラリです。
  • ImageTk, io: これらは画像を扱うために使用されます。ImageTkはこのコードでは使用されていませんが、通常は画像をTkinterウィジェットで使用する際に必要となります。ioはバイナリデータを扱うために使われます。

ステップ 3: QRコード生成関数の作成

def generate_qr_code(data):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    return img

この関数は、入力データを受け取り、そのデータからQRコードを生成して返します。
qrcode.QRCodeのパラメータはQRコードのバージョン、エラー訂正レベル、ボックスサイズ、ボーダーサイズを設定します。
add_dataメソッドでQRコードに含めるデータを追加し、make_imageメソッドで実際の画像を生成します。

ステップ 3: GUIレイアウトの作成

GUIのレイアウトを定義しています。

layout = [
    [sg.Text("データを入力してください:"), sg.InputText(key='DATA')],
    [sg.Button("QRコードを生成"), sg.Button("保存", disabled=True, key='SAVE')],
    [sg.Image(key='IMAGE')],
]

テキスト入力フィールド、2つのボタン(QRコード生成用と保存用)、そしてQRコードを表示するためのイメージウィジェットが含まれます。
sg.Button(“保存”, disabled=True, key=’SAVE’)により、初期状態では「保存」ボタンが無効化されます。

ステップ 4: イベントループの作成

# 生成された画像を一時的に保持する変数
generated_image = None

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event == "QRコードを生成":
        data = values['DATA']
        if data:
            img = generate_qr_code(data)
            bio = io.BytesIO()
            img.save(bio, format="PNG")
            window['IMAGE'].update(data=bio.getvalue())
            generated_image = img  # 生成された画像を保存
            window['SAVE'].update(disabled=False)  # 保存ボタンを有効にする
        else:
            sg.popup("データを入力してください。")

アプリケーションのメインループで、ユーザーのアクションを待ち受けています。
ウィンドウが閉じられた場合、ループを抜けてプログラムを終了します。
「QRコードを生成」ボタンが押された場合、入力されたデータに基づいてQRコードを生成し、それを表示します。また、この時点で「保存」ボタンを有効にします。
この時点では「保存」ボタンを押しても保存されません。

ステップ 5: 保存を追加

先ほどのコードにQRコード用の保存機能を追加させます。

# 生成された画像を一時的に保持する変数
generated_image = None

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event == "QRコードを生成":
        data = values['DATA']
        if data:
            img = generate_qr_code(data)
            bio = io.BytesIO()
            img.save(bio, format="PNG")
            window['IMAGE'].update(data=bio.getvalue())
            generated_image = img  # 生成された画像を保存
            window['SAVE'].update(disabled=False)  # 保存ボタンを有効にする
        else:
            sg.popup("データを入力してください。")
    elif event == "SAVE" and generated_image is not None:
        save_path = sg.popup_get_file('保存先を選択してください', save_as=True, no_window=True, file_types=(("PNG Files", "*.png"),))
        if save_path:
            if not save_path.endswith('.png'):
                save_path += '.png'
            generated_image.save(save_path)
            sg.popup(f"QRコードを保存しました: {save_path}")

「保存」ボタンがクリックされると、sg.popup_get_fileを使用してファイル保存ダイアログを表示し、ユーザーが保存先を指定できます。指定されたパスに画像を保存します。

最終的に実行すると下記のようになります。

🔳.全体のコード

全体のコードは以下のようになります。

import PySimpleGUI as sg
import qrcode
from PIL import ImageTk
import io

def generate_qr_code(data):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data)
    qr.make(fit=True)

    img = qr.make_image(fill_color="black", back_color="white")
    return img

layout = [
    [sg.Text("データを入力してください:"), sg.InputText(key='DATA')],
    [sg.Button("QRコードを生成"), sg.Button("保存", disabled=True, key='SAVE')],  # 保存ボタンを追加、初期は無効
    [sg.Image(key='IMAGE')],
]
window = sg.Window("QRコードジェネレータ", layout)

# 生成された画像を一時的に保持する変数
generated_image = None

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    if event == "QRコードを生成":
        data = values['DATA']
        if data:
            img = generate_qr_code(data)
            bio = io.BytesIO()
            img.save(bio, format="PNG")
            window['IMAGE'].update(data=bio.getvalue())
            generated_image = img  # 生成された画像を保存
            window['SAVE'].update(disabled=False)  # 保存ボタンを有効にする
        else:
            sg.popup("データを入力してください。")
    elif event == "SAVE" and generated_image is not None:
        save_path = sg.popup_get_file('保存先を選択してください', save_as=True, no_window=True, file_types=(("PNG Files", "*.png"),))
        if save_path:
            if not save_path.endswith('.png'):
                save_path += '.png'
            generated_image.save(save_path)
            sg.popup(f"QRコードを保存しました: {save_path}")

このコードは、GUIを介してユーザーが動的にデータを入力し、そのデータを基にQRコードを生成し表示、そして任意の場所に保存するプロセスを簡単に行うことができるアプリケーションを作成する方法を示しています。

記事