0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Tkinter】ネット上の画像を表示する方法

Last updated at Posted at 2022-12-26

前置き

私はPythonのシステム開発でTkinterを使用するのですが、ネット上の画像を表示するために奮闘していました。
便利なライブラリを見つけましたので共有したいと思います。

どんなライブラリ?

「tkhtmlview」というtkinter上にHTMLを表示できるライブラリです。

【参考】
https://torimakujoukyou.com/python-tkinter-htmllabel/

インストール

pipインストールでOKです!

cmd
>>pip install tkhtmlview

サンプル

example.py
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を編集することが出来ます。

Python:example.py
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行目の下に、この様な追加を行ってください。

html_parser.py
# ↑省略
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を用意しなくて良いのは楽ですが、融通が利かないので不便ではあります。
何かご指摘等ありましたらコメントいただけますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?