見出し画像

【Python練習-009】PythonとTkinterで作る!WEBPからPNGへ簡単画像変換アプリ


概要


このPythonコードは、GUIを使用してWEBP形式の画像ファイルをPNG形式に変換するアプリケーションを作成するためのものです。

実行画面は次のようになります。

GUIの部分はTkinterを使用しており、ユーザーはフォルダを選択できるようになっています。変換機能では、選択されたフォルダ内の全てのWEBPファイルをPNGに変換し、元のファイルを別のフォルダに移動させます。このプロセスはエラー管理も含まれています。

ライブラリをインストール


まずはライブラリをインストールしましょう

pip install pillow

生成AIを利用(プロンプト)

生成AIに手伝ってもらいました。
このコードを生成するためのプロンプトは次のようになります:

「PythonでGUIを使ったWEBPからPNGへの画像変換アプリケーションを作成したい。アプリはTkinterを利用し、ユーザーがフォルダを選択してその中のWEBPファイルをPNGに変換する機能を持つ。変換後のファイルは元のファイルを移動することで整理を行う。変換プロセス中に起こりうるエラーはユーザーに通知する必要がある。」

コード

import os
from PIL import Image

def convert_webp_to_png(source_folder, dest_folder):
    # 変換済みのwebpファイルを移動するためのフォルダを作成
    done_folder = os.path.join(source_folder, 'done')
    os.makedirs(done_folder, exist_ok=True)

    # sourceフォルダ内のwebpファイルをpngに変換し、変換済みファイルをdoneフォルダに移動
    for filename in os.listdir(source_folder):
        if filename.endswith('.webp'):
            source_path = os.path.join(source_folder, filename)
            dest_path = os.path.join(dest_folder, os.path.splitext(filename)[0] + '.png')
            done_path = os.path.join(done_folder, filename)

            try:
                with Image.open(source_path).convert("RGB") as im:
                    im.save(dest_path)
                os.rename(source_path, done_path)
            except Exception as e:
                print(f'Error converting {filename}: {e}')

import tkinter as tk
from tkinter import filedialog

def browse_source_folder():
    source_folder = filedialog.askdirectory()
    source_folder_entry.delete(0, tk.END)
    source_folder_entry.insert(0, source_folder)

def browse_dest_folder():
    dest_folder = filedialog.askdirectory()
    dest_folder_entry.delete(0, tk.END)
    dest_folder_entry.insert(0, dest_folder)

def run_conversion():
    source_folder = source_folder_entry.get()
    dest_folder = dest_folder_entry.get()
    if source_folder and dest_folder:
        convert_webp_to_png(source_folder, dest_folder)
    else:
        error_label.config(text='ソースフォルダとデスティネーションフォルダを選択してください')

root = tk.Tk()
root.title('webp to png converter')

source_folder_label = tk.Label(root, text='ソースフォルダ:')
source_folder_label.grid(row=0, column=0, padx=5, pady=5, sticky='w')
source_folder_entry = tk.Entry(root, width=50)
source_folder_entry.grid(row=0, column=1, padx=5, pady=5)
source_browse_button = tk.Button(root, text='参照', command=browse_source_folder)
source_browse_button.grid(row=0, column=2, padx=5, pady=5)

dest_folder_label = tk.Label(root, text='デスティネーションフォルダ:')
dest_folder_label.grid(row=1, column=0, padx=5, pady=5, sticky='w')
dest_folder_entry = tk.Entry(root, width=50)
dest_folder_entry.grid(row=1, column=1, padx=5, pady=5)
dest_browse_button = tk.Button(root, text='参照', command=browse_dest_folder)
dest_browse_button.grid(row=1, column=2, padx=5, pady=5)

convert_button = tk.Button(root, text='コンバート', command=run_conversion)
convert_button.grid(row=2, column=1, padx=5, pady=5)

error_label = tk.Label(root, text='', fg='red')
error_label.grid(row=3, column=1, padx=5, pady=5)

root.mainloop()

きちんと動きました。
自分が欲しい動作をするコードが得られるまで、プロンプトを微調整しながら、何回か試行錯誤しました。

関連記事

では🌸


この記事が気に入ったらサポートをしてみませんか?