ChatGPTにpysimpleGUIを使った画像viewerを作ってもらう

画像ビューワーを作りたい、でもコード書きたくない、、ChatGPTに書いてもらおう!

chatGPTに画像ビューワーを作ってもらうことにしました。パスの指定が大変なのでpysimpleGUIでファイルを指定するようにします。

前回の記事、Hello Medical Python!の反省を踏まえて、GUIのテーマカラーはHOTDOGSTANDでいきましょう

ChatGPTにpysimpleGUIのコードを書いてもらう

ChatGPTへの指示

以下の事を行うコードを教えてください よろしくお願いいたします。
ただしpysimpleGUIのカラーテーマはhotdogstandにしてください
1.pysimpleGUIを使って画像ファイルを指定する 2.別のwindowで画像を表示させる

ChatGPTの回答です
以下は、pysimpleGUIを使って画像ファイルを指定して別のウィンドウで表示するコードです。カラーテーマはhotdogstandに設定されています。sg.FileBrowse()を使って画像ファイルを指定し、選択されたファイル名をfilenameに代入しています。そして、sg.Image()を使ってfilenameで指定された画像を表示しています。

import PySimpleGUI as sg

# カラーテーマの設定
sg.theme('hotdogstand')

# 画像ファイルを指定するウィンドウのレイアウト
input_layout = [
    [sg.Text("画像ファイルを選択してください:")],
    [sg.Input(key='-FILE-', enable_events=True, visible=False)],
    [sg.FileBrowse("参照", target='-FILE-', file_types=(("JPEGファイル", "*.jpg"), ("PNGファイル", "*.png")))],
    [sg.Submit()]
]

# 画像を表示するウィンドウのレイアウト
output_layout = [
    [sg.Image(key='-IMAGE-')],
    [sg.Button("閉じる")]
]

# ウィンドウの生成
input_window = sg.Window("画像ファイルの選択", input_layout)
output_window = sg.Window("画像表示", size=(800, 600))

# イベントループ
while True:
    event, values = input_window.read()

    # 画像ファイルを選択するウィンドウのイベント処理
    if event == "Submit":
        filename = values['-FILE-']
        input_window.close()

        # 画像を表示するウィンドウを開く
        output_window.Layout(output_layout).finalize()
        output_window.Element('-IMAGE-').Update(filename=filename)

        # 画像を表示するウィンドウのイベント処理
        while True:
            event, values = output_window.read()
            if event in (sg.WINDOW_CLOSED, "閉じる"):
                output_window.close()
                break

    # 画像ファイルを選択するウィンドウが閉じられた場合のイベント処理
    if event in (sg.WINDOW_CLOSED, "Exit"):
        break

# ウィンドウを破棄
input_window.close()
output_window.close()

実行結果!

凄い色のセンスやねん、、

黒い蝶.pngという画像データを表示させましたが、問題が、、
・pngは背景が透明なのでpysimpleGUIの画像テーマが強く影響している
・jpeg画像を指定するとエラーが出る


jpeg画像を選ぶとエラーが出る事をChatGPTに指摘します。

pysimpleGUIではjpegを表示するのに、ひと手間必要jpeg画像をpngに変換する処理を追加

chatGPTに問題点を指摘します。

上記のコードを実行しましたが、png形式のデータでは画像が表示されました。しかしjpeg形式のデータではエラーがでます。修正してください

jpeg形式の画像ファイルを表示するためには、Pillow (Python Imaging Library) パッケージが必要です。以下の手順でPillowをインストールしてください。

  1. コマンドプロンプト (Windows) またはターミナル (Mac, Linux) を開きます。
  2. 以下のコマンドを入力し、Pillowをインストールします。
pip install Pillow

Pillowがインストールされたら、以下の修正を加えてください。

  1. import PySimpleGUI as sg の下に from PIL import Image を追加します。
  2. sg.Imagesg.Image(filename=img_path) に変更します
  3. 以下がコード全文になります
import PySimpleGUI as sg
from PIL import Image

# 画像選択ウィンドウのレイアウト
file_layout = [
    [sg.Text("表示する画像を選択してください")],
    [sg.Input(key="-FILE-", visible=False), sg.FileBrowse("ファイル選択")],
    [sg.Submit(), sg.Cancel()]
]

# ウィンドウの生成
file_window = sg.Window("画像選択", file_layout, finalize=True)

# イベントループ
while True:
    event, values = file_window.read()
    
    # 画像選択ウィンドウのイベント処理
    if event == "Submit":
        img_path = values["-FILE-"]
        file_window.close()
        
        # 画像を表示するウィンドウを開く
        img = Image.open(img_path)
        img_width, img_height = img.size
        img_layout = [
            [sg.Image(filename=img_path, size=(img_width, img_height))],
            [sg.Button("閉じる")]
        ]
        img_window = sg.Window("画像表示", img_layout, finalize=True)
        
        # 画像を表示するウィンドウのイベント処理
        while True:
            event, values = img_window.read()
            if event in (sg.WINDOW_CLOSED, "閉じる"):
                img_window.close()
                break
                
    # キャンセルボタンが押された場合のイベント処理
    if event in (sg.WINDOW_CLOSED, "Cancel"):
        break

# ウィンドウを破棄
file_window.close()

はい!またエラーです。実はpysimpleGUIはpngとGIFしかサポートしてないらしい。
そこで以下のように指示をだしました。
pysimpleGUIではjpeg画像が表示されません。上記のコードにjpegをpngに変換するコードを追加してください

chatGPTの回答
以下のように、jpeg画像をPillowライブラリを使って一度開き、png形式に変換してから表示するように修正してみてください。

import PySimpleGUI as sg
from PIL import Image
import io

# 画像選択ウィンドウのレイアウト
file_layout = [
    [sg.Text("表示する画像を選択してください")],
    [sg.Input(key="-FILE-", visible=False), sg.FileBrowse("ファイル選択")],
    [sg.Submit(), sg.Cancel()]
]

# ウィンドウの生成
file_window = sg.Window("画像選択", file_layout, finalize=True)

# イベントループ
while True:
    event, values = file_window.read()
    
    # 画像選択ウィンドウのイベント処理
    if event == "Submit":
        img_path = values["-FILE-"]
        file_window.close()
        
        # 画像を表示するウィンドウを開く
        img = Image.open(img_path)
        img = img.convert("RGB") # jpeg画像の場合はRGB形式に変換する
        img_bytes = io.BytesIO()
        img.save(img_bytes, format="png") # png形式に変換する
        img_bytes.seek(0) # バイト列の先頭にシーク
        img_layout = [
            [sg.Image(data=img_bytes.read(), size=(img.width, img.height))],
            [sg.Button("閉じる")]
        ]
        img_window = sg.Window("画像表示", img_layout, finalize=True)
        
        # 画像を表示するウィンドウのイベント処理
        while True:
            event, values = img_window.read()
            if event in (sg.WINDOW_CLOSED, "閉じる"):
                img_window.close()
                break
                
    # キャンセルボタンが押された場合のイベント処理
    if event in (sg.WINDOW_CLOSED, "Cancel"):
        break

# ウィンドウを破棄
file_window.close()

dogcat.jpeg 表示できました!!

以上!chatGPTを使ってpysimpleGUIの画像ビューワーを作るでした。

Pythonによる医用画像処理入門 (医療AIとディープラーニングシリーズ) [ 藤田 広志 ]
価格:3,740円(税込、送料無料) (2023/5/8時点)楽天で購入

コメント

Copied title and URL