やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PythonのwebbrowserでHTMLファイルを表示する

前回のつづき。DB内のデータから画像を表示できるようになった!

成果物

GitHub

開発環境

背景

SQLite3に保存したHTML文字列データをHTMLとして描画し、ディスプレイに表示したい。

本当はリアルタイム編集できるようにしたい。つまり、ファイル保存せず、textデータやio.StringIOなどメモリ上の文字列データを渡すとリアルタイムに反映されるようにしたい。

いちいち編集するたびにファイルに書き込むことを避ければディスクの劣化も避けられる。

今回

上記のようなことができる方法は見つけられなかった。

HTMLファイルを渡すことでブラウザ起動し、表示する方法なら見つけたのでやってみた。

参考

Creating and Viewing HTML Files with Python | Programming Historian 21.1. webbrowser — 便利なウェブブラウザコントローラー — Python 3.6.0 ドキュメント

要点

import webbrowser
webbrowser.open_new_tab(uri)

ローカルファイルの場合はURIを以下のようにする。

uri = 'file:///' + 'home/user/test.html'

HTTP上にある場合はURIを以下のようにする。

uri = 'https://' + 'www.google.co.jp/'

やりたかったこと

from io import StringIO
import webbrowser

html = """<html>
<head></head>
<body><p>Hello World on memory!</p></body>
</html>"""

webbrowser.open_new_tab(StringIO(html))

io.StringIOを渡してHTMLを描画できたら嬉しかった。べつに普通のテキスト変数値でもいい。UIでHTML文字列を編集するとすぐ表示に反映されるのが理想。

しかし現実は実行すると以下のようなエラーがでる。webbrowser.open_new_tab()URIしか引数に取れないと思われる。

Traceback (most recent call last):
  File "main.py", line 13, in <module>
    webbrowser.open_new_tab(StringIO(html))
  File "/usr/lib/python3.4/webbrowser.py", line 68, in open_new_tab
    return open(url, 2)
  File "/usr/lib/python3.4/webbrowser.py", line 60, in open
    if browser.open(url, new, autoraise):
  File "/usr/lib/python3.4/webbrowser.py", line 157, in open
    for arg in self.args]
  File "/usr/lib/python3.4/webbrowser.py", line 157, in <listcomp>
    for arg in self.args]
TypeError: Can't convert '_io.StringIO' object to str implicitly

所感

ファイルでなくメモリ上のテキストから表示する方法はないものか。