「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を実行することを指します。
具体的に言うと、以下の流れになります。
- JavaScriptからPythonに画像のデータ(Data URI)を要求する
- Pythonで画像ファイルをData URIに変換する
- 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指定で読み込む形でも問題ないです。
ソースを見て不明な点があれば、紹介した記事をご覧ください。