前置き
私はPythonのシステム開発でTkinterを使用するのですが、ネット上の画像を表示するために奮闘していました。
便利なライブラリを見つけましたので共有したいと思います。
どんなライブラリ?
「tkhtmlview」というtkinter上にHTMLを表示できるライブラリです。
【参考】
https://torimakujoukyou.com/python-tkinter-htmllabel/
インストール
pipインストールでOKです!
>>pip install tkhtmlview
サンプル
from tkhtmlview import HTMLLabel
import tkinter as tk
root = tk.Tk()
root.title("テスト")
root.geometry("800x500")
# 画像表示(※「ここにURL」と書かれた箇所に画像のURLアドレスを入力してください)
html_label = HTMLLabel(root, html=f"<a href='ここにURL'><img src='ここにURL' width='250' height='250'></a>")
html_label.pack()
root.mainloop()
必要に応じてwidthやheightを変更してください。
HTMLLabelウィジェットは削除できない
tkinterであればwidgetの削除は「.destroy()」で行いますが、HTMLLabelには効かないようです。
その為、何度も生成を繰り返すとメモリを多く消費してしまいます。
そこで下記の様に生成済みのHTMLLabelを編集することが出来ます。
html_label.set_html(f"<p>ああああ</p>")
こんな感じで「.set_html」を使用すると内容を変更できます
動作が重い時
多くの画像を読み込むと、キャッシュを溜めまくり重くなる場合があります。
残念ながらtkhtmlviewにキャッシュをクリアする機能は実装されていないので、自分で追加する必要があります。
以下の方法はあくまで自己責任です。何があっても責任は追えませんので悪しからず。
下記のPythonファイルを開いてください
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37\Lib\site-packages\tkhtmlview\html_parser.py
493行目の下に、この様な追加を行ってください。
# ↑省略
elif tag == HTML.Tag.IMG and attrs[HTML.Attrs.SRC]:
#-------------------------------------------------------------------- [ UNSTYLED_TAGS ]
image = None
##### ここに追加 #####
if len(self.cached_images) > 50: # キャッシュが50件たまったら削除
self.cached_images.clear() # 削除
##### 追加終わり #####
if attrs[HTML.Attrs.SRC].startswith(("https://" , "ftp://" , "http://")):
if attrs[HTML.Attrs.SRC] in self.cached_images.keys():
# ↓省略
追加部分の「if len(self.cached_images) > 50:」ですが、50件でなくても問題ありません。
好きな整数を入力しておいてください。
これで保存するとキャッシュが50件溜まると削除される機能の実装完了です。
キャッシュの意味あるのかと言われてしまえばそれまでですが、どうぞ優しい目で許してください。
まとめ
tkhtmlview側でrequestでダウンロードしているようですね。
canvasを用意しなくて良いのは楽ですが、融通が利かないので不便ではあります。
何かご指摘等ありましたらコメントいただけますと幸いです。