AIで遊ぼうよ

AIで遊んでいます

ChatGPTでデスクトップアプリを作る

ChatGPTでプログラミング:

ChatGPTにお願いすれば、プログラミングの知識が一切なくても簡単なデスクトップアプリケーションを作ることができます。

私はStable DiffusionでAI画像を作成しているのですが、大量に自動作成される画像の中には失敗や不要な画像も出来てしまいます。そんな画像について取捨選択をするために画像管理ソフトで管理しているのですが、とりあえずフォルダの画像を表示してみて不要なものを削除だけできれば良いので、そんなデスクトップアプリを作ってみます。

 

準備するもの:

ChatGPTはpythonでコードを書くのが得意です。
なので、書いてもらったコードを実行できるようにpythonの環境を構築しましょう。

構築自体は簡単なので、以下のサイト等を参考にpython環境を構築してください。

prog-8.com

 

また、コードの確認ができるようにVisual Studio Codeをインストールしましょう。

www.javadrive.jp

Visual Studio Codeの日本語化はこちら

www.javadrive.jp

 

作ってみる:

早速作ってみましょう。

今回は無料で使えるGPT-3.5でやってみます。

まず要件をChatGPTに伝えます。ここは具体的に要件を列挙すると良いです。今回は以下のように注文してみました。

 

フォルダ内の画像を表示する画像ビューワのPythonプログラムを作ってください。要件は以下のとおりです。
・指定したフォルダに格納されている画像を表示します。フォルダに画像がない場合はエラーとならないようにしてください。
・前後の画像への移動はキーボードの矢印キーでできるようにしてください。
・キーボードのデリートキーで表示している画像をゴミ箱に入れて、次の画像を自動で表示してください。
・表示する画像のサイズに合わせてウィンドウのサイズを自動調整してください。

 

すげー!ちゃかちゃかと書いてくれます。

 

早速、書いてくれたコードの右上にある「Copy code」をクリックしてコピー。Visual Studio Codeで新しいテキストファイルを表示してSelect a LanguageでPythonを選択。さっきコピーしたコードをペーストして右上の再生ボタンで実行しましょう。

するとエラーが出ちゃいました。ここは皆さんの環境によって出るエラーが異なると思います。

助けてChatGPT!

なるほど、今回ChatGPTが書いてくれたコードのモジュールをインストールしてなかったのが原因のようです。指定されたとおりにコマンドプロンプトを立ち上げてコマンドを実行しました。

インストールが無事されましたね。
そんでまた実行。

あらら、またエラーです。
また、ChatGPTに聞いてみます。

よくわからんけど修正コードを書いてくれたのでこれをコピペして実行!

おおー!動きました。シンプルな機能しかないので動作が軽く十分そうです。

そして、機能を追加したかったら修正をお願い。やっぱ要件を変更したかったらまた修正をお願い。嫌な顔せずいくらでもやってくれます。

そして出来たのが以下のコード。

import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import keyboard

class ImageViewer:
    def __init__(self, root):
        self.root = root
        self.root.title("Image Viewer")
        
        self.image_paths = []
        self.current_index = 0

        self.canvas = tk.Canvas(root)
        self.canvas.pack(fill=tk.BOTH, expand=True)
        
        # キーボードイベントを設定
        keyboard.add_hotkey('delete', self.delete_image)
        keyboard.add_hotkey('left', self.prev_image)
        keyboard.add_hotkey('right', self.next_image)

    def open_folder(self):
        folder_path = filedialog.askdirectory()
        if folder_path:
            self.image_paths = [os.path.join(folder_path, filename) for filename in os.listdir(folder_path) if filename.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp'))]
            self.current_index = 0  # フォルダを切り替えた場合、最初の画像から再開する
            self.show_image()

    def show_image(self):
        if self.image_paths and 0 <= self.current_index < len(self.image_paths):
            image_path = self.image_paths[self.current_index]
            image = Image.open(image_path)

            # ウィンドウサイズを画像のサイズに合わせて変更
            self.root.geometry(f"{image.width}x{image.height}")
            
            # 画像をウィンドウサイズに合わせて表示
            photo = ImageTk.PhotoImage(image)
            if hasattr(self, 'canvas_image'):
                self.canvas.itemconfig(self.canvas_image, image=photo)
            else:
                self.canvas_image = self.canvas.create_image(0, 0, anchor=tk.NW, image=photo)
            self.canvas.image = photo

    def prev_image(self):
        if self.image_paths:
            self.current_index = (self.current_index - 1) % len(self.image_paths)
            self.show_image()

    def next_image(self):
        if self.image_paths:
            self.current_index = (self.current_index + 1) % len(self.image_paths)
            self.show_image()

    def delete_image(self):
        if self.image_paths:
            if 0 <= self.current_index < len(self.image_paths):
                image_path = self.image_paths[self.current_index]
                os.remove(image_path)
                self.image_paths.pop(self.current_index)
                if len(self.image_paths) == 0:
                    self.current_index = 0
                elif self.current_index >= len(self.image_paths):
                    self.current_index = len(self.image_paths) - 1
                self.show_image()

if __name__ == "__main__":
    root = tk.Tk()
    app = ImageViewer(root)
    
    menu_bar = tk.Menu(root)
    root.config(menu=menu_bar)
    file_menu = tk.Menu(menu_bar)
    menu_bar.add_cascade(label="File", menu=file_menu)
    file_menu.add_command(label="Open Folder", command=app.open_folder)
    
    root.mainloop()

 

動作確認を十分にしたわけではないですが、私の使用用途であれば何も問題ありませんでした。

これを名前をつけて保存。拡張子をpywにすればコマンドプロンプトを表示をなくせてデスクトップアプリ感でてきます。また、exeファイル化することでpython環境がなくても動作するようになります。方法は以下を参考に。

techplay.jp

こんな簡単にデスクトップアプリができちゃいました。めちゃくちゃいい時代になりましたね。

 

おわり:

今回は、ChatGPTでデスクトップアプリを作ってみました。
知識がある人が見たら鼻で笑いそうな作り方やクオリティだと思いますが、知識が全くない自分でもできるというのが凄いところですね。

この記事を参考に自分だけのニッチなデスクトップアプリを作ってみてください。

 

ChatGPTの始め方は以下の記事を参考にしてみてください。

ai-de-asobou.hatenadiary.jp

また、有料プランと無料プランの違いは以下の記事です。

ai-de-asobou.hatenadiary.jp