先日、JRubyでJavaFXプログラムを作る(Hello world編) - torutkのブログ で、JRuby環境でRubyスクリプトからJavaFX GUIを利用してHello worldな画面を表示してみました。今回は、Jython環境でPythonスクリプトからJavaFX GUIを利用してHello worldな画面を表示してみます。
JythonをWindows環境にインストール
Jython公式ページから、現時点で最新のJython 2.7.0 Installerをダウンロードします。
http://www.jython.org/
Jythonのバージョンの頭2桁は、Pythonのバージョンと一致させているので、Jython 2.7.x は、Python 2.7相当となります。
- jython-installer-2.7.0.jar
このインストーラーは、Javaで実行するOS・パッケージシステム非依存のものです。
Windowsであればこのファイルをエクスプローラーでダブルクリックするとインストーラーが実行され、インストール画面が表示されます。
インストール種類を選択します。通常はStandardでよさそうです。
インストール場所を選択します。デフォルトでは次の画面のようにC:\jython2.7.0ですが、ルート直下は好みではないので、ここではC:\tools\jython2.7.0としました。
設定が一通り終わると確認画面が表示されます。Javaのバージョンは選択の余地なくインストーラが検知したもの(おそらくインストーラ自身を起動したJava)が設定されています。
インストールが終了したら、環境変数PATHにインストールディレクトリ\bin(この例では、C:\tools\jython2.7.0\bin)を追加しておきます。
動作確認のため、hello.pyを作成し実行させてみます。
print "Hello jython"
C:\work> jython hello.py Hello jython
JythonでPythonからJavaFXを利用して画面を表示
from javafx.application import Application class MessageBoard(Application): def start(self, stage): stage.setWidth(640) stage.setHeight(480) stage.setTitle("Hello Jython") stage.show() if __name__ == "__main__": Application.launch(MessageBoard().class, [])
コマンドライン引数の取得は省略しています。
アニメーション
from javafx.application import Application from javafx.scene import Group from javafx.scene import Scene from javafx.scene.text import Text from javafx.animation import Interpolator from javafx.animation import TranslateTransition from javafx.util import Duration class MessageBoard(Application): def start(self, stage): message = Text("Hello, world. This is Jython") transition = TranslateTransition(Duration.seconds(8), message) transition.setFromX(200); transition.setToX(-200); transition.setInterpolator(Interpolator.LINEAR) transition.setCycleCount(TranslateTransition.INDEFINITE) group = Group() group.getChildren().add(message) group.setLayoutY(50) scene = Scene(group, 200, 100) stage.setScene(scene) stage.setTitle("Hello Jython") stage.show() transition.play() if __name__ == "__main__": Application.launch(MessageBoard().class, [])
はまったこと、エラー対処
可変長引数には対応していない模様
- Group()
- Group(Collection
) - Group(Node...)
ここに、Textインスタンスを1つ指定します。
group = Group(message)
これは、
TypeError: javafx.scene.Group(): 1st arg can't be coerced to javafx.scene.Node[], java.util.Collection
とエラーになってしまいました。可変長引数は内部的には配列として扱っているからかと思います。
group = Group() group.getChildren().add(message)
と書いてあげればOKでした。