« 日記 |Main| log »

« JavaでSuffixArray | Java | Javaでグラフの連結成分を求める »

« QuickSort祭り(一人) | Python | Pythonで87文字でCollatz角谷問題の(以下略 »

[Jython]Javaで定義されたフィールドを名前の文字列で取得する方法

SWTでは、たとえばSHIFT+CTRL+F5をメニューのアクセラレータに指定するには

from org.eclipse.swt import SWT
menu.setAccelerator(SWT.SHIFT + SWT.CTRL + SWT.F5)

というようにおのおのの値を足しあわせてやる必要があります。しかしいちいちSWTと書くのは面倒ですし、 from org.eclipse.swt.SWT import * とやってSWTパッケージの中身を全部取得してしまうのはスマートではありません。そこで "SHIFT+CTRL+F5" という文字列を"+"でsplitして、"SHIFT"という文字列からSWT.SHIFTの値を取得しようと思いました。

Pythonでは、あるパッケージ X の中にある name という名前のオブジェクトは X.__dict__[name] で取得することができます。しかしJythonでこれをやると、オブジェクトは取得されますが、フィールドが整数であっても取得されたオブジェクトはPyIntegerではなくPyReflectedFieldです。_dogetを呼んでPyIntegerを取得してやる必要があります。

下のコードでは、"CTRL+SHIFT+O"などという文字列がaccelに入っている場合に、 SWT.CTRL + SWT.SHIFT + ord("O") をメニューmenuのアクセラレータに指定し、与えられた文字列自身もメニューに表示します。

	if accel != "":
		from org.eclipse.swt import SWT
		intAccel = 0
		for key in accel.split("+"):
			if SWT.__dict__.has_key(key):
				v = SWT.__dict__[key]._doget(SWT)
				intAccel += v
			else:
				intAccel += ord(key)
		
		menu.setAccelerator(intAccel)
		menu.setText(text + " " + accel)

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/174

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.