【Python】GUIアプリで簡単画像表示(pywebview)

【Python】GUIアプリで簡単画像表示(pywebview) プログラミング

「PythonのGUIアプリで画像を表示したい」
「GUIアプリのデザインや表現に限界を感じている・・・」

このような場合には、この記事の内容が参考となります。
この記事では、PythonのGUIアプリで簡単に画像を表示する方法を解説しています。

本記事の内容

  • GUIアプリで簡単画像表示
  • 簡単画像表示のシステム要件
  • 簡単画像表示の仕組み(仕様)
  • 簡単画像表示のサンプルコード

それでは、上記に沿って解説していきます。

GUIアプリで簡単画像表示

犬の画像は、PythonのGUIアプリ上で表示しています。
GUIアプリでは、画像一つ表示するのに苦労します。

苦労する様は、次の記事からも理解できるでしょう。

たった一つの画像を表示するだけ、どうしてこんなに苦労するのでしょうかね・・・
それに対して、Webなんて非常に簡単に画像を表示できます。

どうにかして、その恩恵を受けれないかを考えました。
結論から言うと、pywebviewを使えばWeb世界の恩恵を受けることが可能です。

pywebviewに関しては、次の記事で解説しています。

pywebviewを使えば、GUIアプリでいろんなことができるようになります。
例えば、GUIアプリで綺麗な表を作成することもできます。

これと同じことを画像表示に関してもやろうということです。
なお、このことを実現するために必要となるスキルは以下となります。

  • Python
  • JavaScript(初級レベル)

あとは、pywebviewについての理解が何よりも必要なります。
一度でも理解できれば、PythonのGUIアプリでの可能性は広がります。

以上、GUIアプリで簡単画像表示について説明しました。
次は、簡単画像表示の仕組みについて確認します。

簡単画像表示のシステム要件

システム要件と言えるモノは、以下。

  • pywebview
  • python-magic

それぞれを以下で説明します。

pywebview

pywebviewを利用してGUIアプリを作成します。
そのため、pywebviewはインストール必須です。

python-magic

今回は、手元にある次の画像を表示します。

dog.png

そして、この画像をPythonで読み込みます。
読み込んでから、Data URIに変換します。

そのための方法は、次の記事でまとめています。

上記記事にあるpython-magicをインストールします。
python-magicは、画像のMIMEタイプを判定するライブラリです。

以上、簡単画像表示のシステム要件について説明しました。
次は、簡単画像表示の仕組み(仕様)を確認します。

簡単画像表示の仕組み(仕様)

pywebviewを用いて、PythonとWebページの連携を行います。
連携とは、JavaScriptからPythonを実行することを指します。

具体的に言うと、以下の流れになります。

  1. JavaScriptからPythonに画像のデータ(Data URI)を要求する
  2. Pythonで画像ファイルをData URIに変換する
  3. JavaScriptでPythonから戻ってきたData URIをもとに画像を表示する

なお、JavaScriptからPythonを実行する方法については次の記事をご覧ください。

以上、簡単画像表示の仕組み(仕様)について説明しました。
次は、簡単画像表示のサンプルコードを確認します。

簡単画像表示のサンプルコード

pywebviewで読み込むhtmlです。

img.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>画像表示</title>
    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script>
        window.addEventListener('pywebviewready', function() {
            pywebview.api.my_exec().then(get_return_from_python);
        })

        function get_return_from_python(response) {
            let img_data_uri = response.img_data_uri;
            let img = document.getElementById("img_target");
            img.src = img_data_uri;
        }
    </script>
  </head>
  <body>
    <img id="img_target">
  </body>
</html>

Pythonのコードは、以下となります。

import webview
import base64
import magic
from pathlib import Path

IMG = "dog.png"
HTML = "img.html"

class Api:
    def __init__(self):
        self.name = "js_api"

    def my_exec(self):
        img_data_uri = get_data_uri(IMG)
        response = {
            'img_data_uri': img_data_uri
        }
        return response


def get_data_uri(path):
    with open(path, "rb") as image_file:
        # bufに格納
        buf = image_file.read()
        # base64のdata取得
        data = base64.b64encode(buf)
        data_str = data.decode('utf-8')
        # MIMEタイプ取得
        mime_type = magic.from_buffer(buf, mime=True)
        # Data URI
        data_uri = "data:" + mime_type + ";base64," + data_str

        return data_uri

    return None


if __name__ == '__main__':

    html = Path(HTML).read_text(encoding="utf-8")
    api = Api()
    window = webview.create_window('GUIアプリで簡単画像表示', html=html, js_api=api, width=600, height=400)
    webview.start()

img.htmlは、Webサーバ上に設置しても構いません。
それをURL指定で読み込む形でも問題ないです。

ソースを見て不明な点があれば、紹介した記事をご覧ください。

タイトルとURLをコピーしました