Pythonでデスクトップアプリを作成する

Pythonでデスクトップアプリを作成するには、GUIライブラリを使用するのが一般的です。最も一般的なGUIライブラリには、Tkinter、PyQt、PySide、Kivyなどがあります。ここでは、Tkinterを使用して簡単なデスクトップアプリを作成し、ユーザーがフォルダを選択し、その中の画像を50枚ずつZIP圧縮する機能を実装します。

必要なライブラリ

  • Tkinter(Pythonの標準ライブラリ)
  • Pillow(画像ファイルのフィルタリングに使用)

Pillowライブラリがインストールされていない場合は、以下のコマンドでインストールできます。

sh
pip install Pillow

スクリプト

以下は、Tkinterを使用してデスクトップアプリを作成するPythonスクリプトです。

python
import os
import zipfile
from tkinter import Tk, Label, Button, filedialog, messagebox
from PIL import Image

class ZipImagesApp:
    def __init__(self, master):
        self.master = master
        master.title("Image Zipper")

        self.label = Label(master, text="Select a folder to zip images")
        self.label.pack(pady=10)

        self.greet_button = Button(master, text="Select Folder", command=self.select_folder)
        self.greet_button.pack(pady=5)

        self.zip_button = Button(master, text="Zip Images", command=self.zip_images)
        self.zip_button.pack(pady=5)

        self.selected_folder = ""

    def select_folder(self):
        self.selected_folder = filedialog.askdirectory()
        if self.selected_folder:
            self.label.config(text=f"Selected folder: {self.selected_folder}")
        else:
            self.label.config(text="No folder selected")

    def zip_images(self):
        if not self.selected_folder:
            messagebox.showerror("Error", "Please select a folder first")
            return

        images = [f for f in os.listdir(self.selected_folder) if os.path.isfile(os.path.join(self.selected_folder, f)) and self.is_image(f)]
        if not images:
            messagebox.showerror("Error", "No images found in the selected folder")
            return

        batch_size = 50
        batch_number = 1
        for i in range(0, len(images), batch_size):
            batch_images = images[i:i + batch_size]
            zip_filename = os.path.join(self.selected_folder, f'batch_{batch_number}.zip')

            with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
                for image in batch_images:
                    zipf.write(os.path.join(self.selected_folder, image), image)

            batch_number += 1

        messagebox.showinfo("Success", "Images have been zipped successfully")

    @staticmethod
    def is_image(filename):
        try:
            Image.open(filename)
        except IOError:
            return False
        return True

def main():
    root = Tk()
    app = ZipImagesApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

スクリプトの説明

  1. Tkinterウィンドウの作成:
    • Tkクラスを使ってメインウィンドウを作成し、その中にラベル、ボタンを配置します。
  2. フォルダ選択ダイアログ:
    • filedialog.askdirectoryを使ってフォルダ選択ダイアログを表示し、ユーザーが選択したフォルダのパスを取得します。
  3. 画像のZIP圧縮:
    • zip_imagesメソッドで、指定されたフォルダ内の画像ファイルを50枚ずつ分割してZIP圧縮します。
    • is_imageメソッドで、ファイルが画像かどうかを確認します。
  4. ユーザーフィードバック:
    • メッセージボックスでエラーメッセージや成功メッセージを表示します。

実行方法

  1. スクリプトをzip_images_app.pyという名前で保存します。
  2. コマンドラインやターミナルでスクリプトを実行します。
sh
python zip_images_app.py
  1. アプリケーションウィンドウが表示されるので、「Select Folder」ボタンをクリックして圧縮したい画像が入っているフォルダを選択し、「Zip Images」ボタンをクリックします。

これで、選択したフォルダ内の画像が50枚ずつ分割されてZIPファイルに圧縮されます。各ZIPファイルはbatch_1.zip, batch_2.zipのように命名され、元のフォルダ内に保存されます。

未分類

Posted by ぼっち