NodeBox on Jython なソフト「NodeJythox」を作ってみた
公開日:
:
Python
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
NodeBoxのソースコードを読んでいたら、こんなコードを発見。
def run(self, source_or_code):
self._initNamespace()
if isinstance(source_or_code, basestring):
source_or_code = compile(source_or_code + "\n\n", "<Untitled>", "exec")
exec source_or_code in self.namespace
if self._check_animation():
if self.namespace.has_key('setup'):
self.namespace['setup']()
self.namespace['draw']()
更にこんなコードも。
def rect(self, x, y, width, height, roundness=0.0, draw=True, **kwargs):
BezierPath.checkKwargs(kwargs)
if roundness == 0: p = self.BezierPath(**kwargs)
p.rect(x, y, width, height)
else:
curve = min(width*roundness, height*roundness)
p = self.BezierPath(**kwargs)
p.moveto(x, y+curve)
p.curveto(x, y, x, y, x+curve, y)
p.lineto(x+width-curve, y)
p.curveto(x+width, y, x+width, y, x+width, y+curve)
p.lineto(x+width, y+height-curve)
p.curveto(x+width, y+height, x+width, y+height, x+width-curve, y+height)
p.lineto(x+curve, y+height)
p.curveto(x, y+height, x, y+height, x, y+height-curve)
p.closepath()
p.inheritFromContext(kwargs.keys())
「あれ?じゃあJython上で動作するNodeBoxって、案外簡単に作れるんじゃないの?」
今までNodeBoxのソースコードを眺めながらNodeBox for Jythonなんてものを思い描いていたけど、設計を練っているだけで、実際にコードを書き出すキッカケがなかった。今がそのキッカケなのかもしれない。時計を見ると22:30。
「よし、24:00までにNodeBox on Jythonを作ってやるぜ!!」
ってことで、Jython (一人)Hackathon開始!!
Jython
ひとまずJythonを入れる。
% which jython
jython not found
% port search jython
jython lang/jython 2.1 Python implementation in pure Java
% sudo port install jython
% which jython
/opt/local/bin/jython
この状態で jython 自体は動くんだけど、jython hogehoge.py とかしても、対話モードに入ってしまう。仕方がないので、MacPortを使用せずにインストール。
% wget http://downloads.sourceforge.net/jython/jython_installer-2.2.1.jar
% java -jar jython_installer-2.2.1.jar
できた!!
んで、Swingなどと格闘すること、1時間ちょい。
「できた!!」
時計を見ると、23:56。ギリギリセーフ!!ウィンドウの見た目とか、oval()にしか対応してないとか、まだまだ微妙だけど、0.0.1ってことで。
ソース
以下、ソース。近々 CodeRepos あたりにアップします。
from pawt import swing
import java
def exit(e): java.lang.System.exit(0)
def run(e):
source_or_code = compile(tacode.getText() + "\n\n", "<Untitled>", "exec")
exec source_or_code
def nbprint(p):
s = "%d" % p
taconsole.append(s)
taconsole.append("\n")
def oval(x, y, w, h):
tacanvas.graphics.drawOval(x,y,w,h)
frame = swing.JFrame('Swing Example', visible = 1)
button = swing.JButton('Run!!', actionPerformed = run)
tacanvas = swing.JTextArea(5,10)
tacanvas = swing.JPanel()
tacanvas.setPreferredSize(java.awt.Dimension(320, 320));
tacode = swing.JTextArea(5,10)
taconsole = swing.JTextArea(5,10)
p = swing.JPanel();
p.setLayout(java.awt.BorderLayout());
p.add(button, java.awt.BorderLayout.PAGE_START)
p.add(tacanvas, java.awt.BorderLayout.LINE_START)
p.add(tacode, java.awt.BorderLayout.LINE_END)
p.add(taconsole, java.awt.BorderLayout.PAGE_END)
frame.contentPane.add(p, java.awt.BorderLayout.CENTER)
frame.pack()
関連記事
- PREV
- X11とGNU Screenとの連携方法について
- NEXT
- irbを使って、ちょっとした実験