とにかく書く

日々の雑感や知り得たことを、とにかく書いています

画像ビューアーの作成2 PySimpleGUI

OpenCV の HighGUI で画像を表示させると、拡大縮小ボタンも表示された。
折角なので拡大ボタンを押して見ると、再描画まで1秒くらいかかった。ボタンクリックの読み取り間隔が遅いのだろうか・・・。

他の方法として Pillow でも画像表示させてみた。私の環境では、ImageMagick で画像が表示された。
ちょっと予想外だったし、そこから自由に作れそうにない。

PySimpleGUI を知って、サンプルを切り貼りして作ってみた。これなら使えそう。

import sys
import io
import PySimpleGUI as sg
from PIL import Image

if len(sys.argv) == 1:
    fname = sg.popup_get_file('Document Browser', 'Document file to open',
                              no_window=True,
                              file_types=(
                                  ("jpeg",     "*.jpg"),
                                  ("jpeg",     "*.jpeg"),
                                  ("png",      "*.png"),
                                  ("tiff",     "*.tiff"),
                                  # add more document types here
                              )
                              )
else:
    fname = sys.argv[1]

if not fname:
    sg.popup("Cancelling:", "No filename supplied")
    raise SystemExit("Cancelled: no filename supplied")

# ------------------------------------------------------------------------------
# use PIL to read data of one image
# ------------------------------------------------------------------------------
def get_img_data(f, maxsize=(1200, 850), first=False):
    """Generate image data using PIL
    """
    img = Image.open(f)
    img.thumbnail(maxsize)
    if first:                     # tkinter is inactive the first time
        bio = io.BytesIO()
        img.save(bio, format="PNG")
        del img
        return bio.getvalue()
    return ImageTk.PhotoImage(img)
# ------------------------------------------------------------------------------
image_elem = sg.Image(data = get_img_data(fname, first=True))
layout = [[image_elem]]
window = sg.Window('Image Browser', layout, return_keyboard_events=True,
                   location=(0, 0), use_default_focus=False)

while True:
    # read the form
    event, values = window.read()
    print(event, values)
    # perform button and keyboard operations
    if event == sg.WIN_CLOSED:
        break

window.close()