QtWebKit.QWebView を使ったPython、JavaScript連携
前々回、WebViewでのC#、JavaSCript間の連携の話題、そして前回IronPythonを使ったWebページの話題という流れて、どうしてもテストしておきたかったのが、Qtを使ったWebViewのPython、JavaScript間相互呼び出しです。
Qtは、LinuxZaurusの開発で経験がありますが(組み込みLinux用なのでQtopiaと呼ばれていましたが)、C++でクロスプラットフォームのGUIアプリケーションを開発できます。歴史は古いのですが、まだまだ現役のようです。最近また触れる機会があり、いろいろと調べてみたところ、WebKitを使ったプログラムが面白そうだということで、ちょっとはまっています。PySideというライブリを使って、Pythonからダイレクトに操作できる点も魅力です。
次の例は、起動するとPythonのプログラムからJavaScript関数を呼び出し、表示されたボタンをクリックすると、Python関数を呼び出すというものです。これはコンソールにメッセージを出力します。
環境: Python 2.7.3 + PySide 1.1.2 / Windows7
import sys from PySide import QtWebKit,QtGui,QtCore html = """ <html> <script> function pyMsg(str){ pyObj.console(str); } function jsFunc(str){ alert(str); } </script> <body> <input type="button" value="btn" onClick="pyMsg('js String')"> </body> </html> """ class jsTest(QtCore.QObject): def __init__(self, parent=None): super(jsTest, self).__init__(parent) @QtCore.Slot(str) def console(self, msg): print msg app = QtGui.QApplication(sys.argv) view = QtWebKit.QWebView() frame = view.page().mainFrame() js = jsTest() view.setHtml(html) frame.addToJavaScriptWindowObject('pyObj', js) frame.evaluateJavaScript("jsFunc('from py Function');") view.show() sys.exit(app.exec_())
他にも、クリックイベント等をフックできるので、デバッグやその他いろいろと楽しいことができます。
自分ブラウザみたいなものを作ってみたくなりますね。