質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3495閲覧

wxpythonのListCtrlでネット上の画像を直接表示させたい

kazuyasi

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/24 13:46

前提・実現したいこと

wxpythonで表を作っているのですが、その表の中にネット上の画像を表示させたいです。
ネット上の画像とは例えば、「http://www.cor-art.com/best/tenkei/down/SA001.JPG」のような直リン画像です。

下記のソースコードでPCの中に入っている画像の表示は出来ました。

よろしくお願い致します。

該当のソースコード

Python

1# -*- coding: UTF-8 -*- 2 3import wx 4 5class App(wx.Frame): 6 def __init__(self, parent, id, title): 7 wx.Frame.__init__(self, parent, id, title, size=(1000, 1000), style=wx.DEFAULT_FRAME_STYLE) 8 9 # ステータスバー 10 self.CreateStatusBar() 11 12 # パネル 13 self.p = wx.Panel(self, -1, pos=(100, 100), size=(800, 800)) 14 p2 = wx.Panel(self, -1, pos=(100, 0),size=(800, 100)) 15 16 self.listctrl2 = wx.ListCtrl(self.p, wx.ID_ANY, style=wx.LC_REPORT, size=(800, 800)) 17 self.listctrl2.InsertColumn(0, heading="画像") 18 self.listctrl2.InsertColumn(1, heading="タイトル", width=400) 19 self.listctrl2.InsertColumn(2, heading="URL", width=200) 20 21 self.kensaku() 22 23 def kensaku(self): 24 25 # イメージリスト 26 imagelist = wx.ImageList(64, 64) 27 imagelist.Add(wx.Icon("a.png", wx.BITMAP_TYPE_PNG)) 28 imagelist.Add(wx.Icon("b.png", wx.BITMAP_TYPE_PNG)) 29 imagelist.Add(wx.Icon("c.png", wx.BITMAP_TYPE_PNG)) 30 imagelist.Add(wx.Icon("d.png", wx.BITMAP_TYPE_PNG)) 31 32 # ListCtrlにイメージリストを割り当て 33 self.listctrl2.AssignImageList(imagelist, wx.IMAGE_LIST_SMALL) 34 35 for i in range(4): 36 self.listctrl2.InsertStringItem(i,"",i) 37 self.Show() 38 39app = wx.App() 40App(None, wx.ID_ANY, 'テスト') 41app.MainLoop()

試したこと

RequestsやPIL、BytesIOを使えば出来そうだったので使ってみたのですが、PILで画像のURLから直接既定の画像閲覧ソフトで表示させたり、画像のバイナリデータを取得することは出来たのですが、表の中に表示させる方法は分からなかったです。

補足情報(FW/ツールのバージョンなど)

Python 3.6.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/12/24 14:17

ローカルファイルが行けるなら、適当なディレクトリにダウンロードして一時ファイル扱いにすれば余裕なのでは?
guest

回答1

0

ベストアンサー

以下のように一時ファイルとしてダウンロードすれば利用できます。
なお、ファイルによってはiCCP: known incorrect sRGB profile警告が表示されますが
ライブラリ側の問題のようなので特に対処はしていません(できない?)。

参考:
How do I read image data from a URL in Python?
libpng warning: iCCP: known incorrect sRGB profile

Python

1# 一時ファイル 2class WebTempPng(object): 3 def __init__(self,url): 4 from PIL import Image 5 import requests 6 from io import BytesIO 7 import tempfile 8 import os.path 9 import uuid 10 11 # ダウンロードしてテンポラリファイルとしてPNG保存 12 response = requests.get(url) 13 img = Image.open(BytesIO(response.content)) 14 self.path = os.path.join( tempfile.gettempdir(), str(uuid.uuid1())+'.png') 15 img.save( self.path, 'PNG') 16 17 def __del__(self): 18 print('del[{}]'.format(self.path)) 19 import os 20 os.remove(self.path) 21 22class App(wx.Frame): 23 # 略 24 # イメージリスト 25 imagelist = wx.ImageList(64, 64) 26 27 #png = WebTempPng('http://www.cor-art.com/best/tenkei/down/SA001.JPG') # iCCP: known incorrect sRGB profile 28 png = WebTempPng('https://bellard.org/bpg/lena30.jpg') # OK 29 #png = WebTempPng('http://optipng.sourceforge.net/pngtech/img/lena.png') # OK 30 imagelist.Add(wx.Icon(png.path, wx.BITMAP_TYPE_PNG))

イメージ説明

投稿2018/12/25 02:30

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyasi

2018/12/28 10:55

回答頂きありがとうございました。こういうケースに一時ファイルを使うんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問