On this page |
Note
JavaScriptからPythonをコールするメソッドは、HoudiniがQt5 UIライブラリに切り替わったのでHoudini16で変更されました。
window.Python
オブジェクトを使用するために記述されたスクリプトは、ブリッジを初期化して、エクスプレッションに対して非同期コールバックスタイルを使用するために書き換えが必要になります。
概要 ¶
組み込みブラウザでページを閲覧する時に、そのページのJavaScriptにwindow.Python
JavaScriptオブジェクトを使用することで、Pythonコードを実行させてHoudiniと通信させることができます。 これは組み込みブラウザでのみ動作します 。
これによって、HTMLインターフェースをセットアップして、Houdiniのシーンから情報を読み込んで、そのシーンを変更させることができます。
例:
// Javascript if (window.Python) { // 現在のシーンを保存するPythonステートメントを実行します。 Python.runStatements("__import__('hou').hipFile.save()"); }
初期化 ¶
JavaScriptからPythonコードを実行する前に、いくつかの初期化がWebページで必要になります。
-
Webページに
qwebchannel.js
ファイルを読み込みます。例:<head> <script language="javascript" src="/path/to/qwebchannel.js"></script> </head>
$HHP/bookish/static/js
からqwebchannel.js
のコピーを取得して、それをWebサーバーにインストールすることができます。 -
そのページが読み込まれた時に、JavaScriptでWebチャンネル通信オブジェクトを作成します:
window.onload = function() { if (!qt || !qt.webChannelTransport) { // Web Channel Transportが存在しないので、 // 組み込みブラウザで実行することができません。 return; } new QWebChannel(qt.webChannelTransport, function(channel) { // Pythonブリッジをwindowオブジェクトに割り当て、 // それをグローバルに利用可能にします。 window.Python = channel.objects.Python; // (オプション) ここでページを読み込み中にPythonをコールします。 window.Python.runStatements("print 'Hello World.'"); }); }
How to ¶
Qt4バージョンとは違い、Qt5でのJavaScriptブリッジのコールは 非同期 です。そのため、このコールはPythonコードが実行されるまで待たずに、すぐに返ります。 Pythonエクスプレッションの結果を取得するには、コールバック関数を登録する必要があります。
Pythonステートメントを実行する
if (window.Python) { window.Python.runStatements("__import__('hou').setFrame(5)"); }
JavaScriptコールはすぐに返り、Pythonは非同期で動作します。コールバックを登録することで、Pythonが終了した時に何かを実行することができます:
window.Python.runStatements( "__import__('hou').setFrame(5)", function() { alert("Frame is set!"); } );
文字列を返すPythonエクスプレッションを実行する
エクスプレッションの結果を取得するには、コールバック関数を渡す必要があります。ブリッジは、Pythonコードが終了した時に、その結果で関数をコールします。
if (window.Python) { window.Python.runStringExpression( "__import__('hou').node('/obj/geo1').path()", function(result) { alert("Path=" + result); } ); }
整数を返すPythonエクスプレッションを実行する
if (window.Python) { window.Python.runIntExpression( "__import__('hou').intFrame()", function(result) { alert("Integer Frame=" + result); } ); }
浮動小数点を返すPythonエクスプレッションを実行する
if (window.Python) { window.Python.runFloatExpression( "__import__('hou').time()", function(result) { alert("Time=" + result); } ); }
Tipsとテクニック ¶
-
ステートメントの実行/評価とエクスプレッションの違いは、Python言語の定義を参照してください。主な違いは、ステートメントに関しては1行以上のステートメントを持つことができ、そこに制御フロー(例えば、
if
,for
)を含めることができ、値を返さないということです。 -
hou
は、それが実行されるPythonコード内で自動的に利用可能にはなりません。そのコードの一部としてhou
をimportする必要があります。 -
基本的には エラーハンドリングがありません 。例外がPython側で発生した場合、Javascript関数は、単に(メソッドに応じて)空っぽの文字列またはゼロを返します。
古いQt4ブラウザでJavaScriptからPythonコードを実行する方法(廃止) ¶
このセクションは情報提供のみを目的としています。
-
Qt4ビルドでは、JavaScriptブリッジを初期化する必要がありません。Qt4組み込みブラウザは、自動的に
window.Python
オブジェクトを作成します。 -
Qt4ブリッジでは、コールはコールバックを使わずに 非同期 で返ります。
window.Python.runStatements(String)
→ null
指定した文字列を1行以上のPythonステートメントとして実行します。ステートメントは改行文字または;
文字を使って分離させることができます。
window.Python.runStringExpression(String)
→ String
指定した文字列をPythonエクスプレッションとして評価し、その結果をJavaScript文字列として返します。
window.Python.runIntExpression(string)
→ Number
指定した文字列をPythonエクスプレッションとして評価し、その結果を整数として返します(JavaScriptではintとfloatの区別がありません)。
window.Python.runFloatExpression(string)
→ Number
指定した文字列をPythonエクスプレッションとして評価し、その結果を可能な限り浮動小数点として返します(JavaScriptではintとfloatの区別がありません)。