Steven Sproat は正しい軌道に乗っていました (私を乗せてくれたことに感謝します - あなたの提案がなければそれを行うことはできませんでした) - 完全な解決策の関連部分を次に示します。
import wx.html as html
import urllib2 as urllib2
import os
import tempfile
import threading
from Queue import Queue
class HTTPThread(threading.Thread):
def __init__(self, urlQueue, responseQueue):
threading.Thread.__init__(self)
self.urlQueue = urlQueue
self.responseQueue = responseQueue
def run(self):
# add error handling
url = self.urlQueue.get()
request = urllib2.Request(url)
response = urllib2.urlopen(request)
page = response.read()
self.responseQueue.put(page)
そして、html.HtmlWindow の派生クラスで:
def OnOpeningURL(self, type, url):
if type == html.HTML_URL_IMAGE:
# If it is a tempfile already, just tell it to open it.
# Since it will be called again
# immediately after first failure only need to keep the last
# temp file within the object, and the former is closed!
if self.f is not None and self.f.name in url:
return html.HTML_OPEN
# if its not a tempfile, download asynchronously and redirect
urlq = Queue()
resq = Queue()
t = HTTPThread(urlq, resq)
t.start()
urlq.put_nowait(url)
while True:
if resq.empty():
# your task while waiting
time.sleep(0.1)
else:
img = resq.get()
break
self.f = tempfile.NamedTemporaryFile()
self.f.write(img)
self.f.seek(0)
return 'file://' + self.f.name
else:
return html.HTML_OPEN
私のアプリケーションでは、これはうまく機能しますが、本当に「通常の Web ブラウザのように」画像をロードしたい場合は、wx.html.HtmlWindow 以上のものが必要になります。ただし、これはノンブロッキングであり、画像を正しくロードします。