Pythonでダイアログのイベント操作をおこなうOOoマクロのサンプルには、 OOo scripting framework and python の dynamicDialog.py があるの ですが、ダイアログのレイアウトをコード内部でいちいち記述しているのが気 に入りません。
OOoBASICでは、 DevelopersGuide の Basics and Dialogs で解説されて いるような、「ダイアログ・エディタで作成したGUIを呼び出して利用する」 のが普通なようです。PythonでOOoマクロを記述する場合も、OOoBASICの場合 と同様に、ダイアログ・エディタを利用した「楽なGUI」をやりたいものです。
このテキストでは、OpenOfficeに付属しているダイアログ・エディタで作成し たGUIを利用するOOoマクロをPythonで作成します。ただし、イベントの関連付 けだけはコード内部に記述します。
UNO経由でのOOoの操作は言語によらずほぼ同じ手順です。ダイアログ操作を伴 うOOoマクロをJavascriptなどで作成する際にも、この文書が参考資料として 役立つとおもいます。
OpenOffice.org Calc を立ち上げます。
メニュー・バーの「ツール(T)」→「マクロ(M)」→「ダイアログの管理(D)」 をクリック。「OpenOffice.org BASIC マクロの管理」というウィンドウが表 示されます。
「マイダイアログ」→「Standard」を選択(クリック)して、「新規作成 (N)」ボタンをクリック。ダイアログ名の入力を求める「新しいダイアログ」 という小さいウィンドウが表示されます。
「新しいダイアログ」の「名前(N)」欄に「simpleDialog」と 入力して「OK」を押します。「マイダイアログ」→「Standard」の下に 「simpleDialog」という項目が作成されます。
「マイダイアログ」→「Standard」の下にある「simpleDialog」を選択して 「編集」ボタンを押す。「マイマクロ & ダイアログ.Standard - OpenOffice.org BASIC」という名前のウィンドウが表示されます。
ツールボックスから、「コマンドボタン」 を選択し、 ダイアログにボタンを作成。ドラッグアンドドロップした大きさでボタンが作 成されます。
ダイアログに作成したボタンをダブルクリック。ボタンのプロパティ・ダイア ログ「プロパティ: CommandButton」が表示されます。
「プロパティ: CommandButton」の「名前」欄を「CommandButton1」に設定。 (※デフォルトで「CommandButton1」のはずなので書き換える必要ないかも) 名前を設定したら「プロパティ: CommandButton」を閉じる。
同様に、ダイアログへテキスト・フィールドを追加します。 ツールボックスから、「テキスト・フィールド」 を選択し、 ダイアログに作成。作成したテキストフィードをダブルクリックしてプロパ ティ・ウィンドウを開く。名前欄に「TextField1」を設定した後、プロパティ・ ウィンドウを閉じる。
ボタンとテキストフィールドの追加が完了したら、ダイアログを保存します。 ダイアログを保存するには、ツールバーにあるフロッピーディスクのアイコン をクリックします。ダイアログの保存が完了すると、 のような灰色をしたフロッピーディスク・アイコンに変わります。
ダイアログ・エディタでの操作はこれで終了。マクロから呼び出すダイアログ が完成しました。
このセクションでやったこと。
マクロコードを記述したPythonファイルを保存するために、 「C:\Documents and Settings\ユーザー名\Application Data\OpenOffice.org2\user\Scripts」 以下に「python」フォルダを作成します。(以下: Scriptpythonフォルダと呼 ぶ)
以下のスクリプトを、「 simpledialog_test.py 」という名前で Scriptpython フォルダ に保存します。めんどうな場合は、 simpledialog_test.py をダウンロードして Scriptpython フォルダ へ保存してください。:
import uno import unohelper from com.sun.star.awt import XActionListener class MyActionListener( unohelper.Base, XActionListener ): def __init__(self, oControl): self.nCount = 0 self.objectControl = oControl def actionPerformed(self, actionEvent): # increase click counter self.nCount = self.nCount + 1; self.objectControl.setText( str( self.nCount ) ) def createDialog(): """This is how to call a Basic dialog""" dialog_name = "simpleDialog" ctx = uno.getComponentContext() smgr = ctx.ServiceManager dp = smgr.createInstance("com.sun.star.awt.DialogProvider") dlg_control = dp.createDialog("vnd.sun.star.script:Standard."+dialog_name+"?location=application") tf1_control = dlg_control.getControl( "TextField1" ) tf1_control.setText("hogehoge!") btn1_listener = MyActionListener( tf1_control ) # add the action listener cmdbtn1_control = dlg_control.getControl("CommandButton1") cmdbtn1_control.addActionListener(btn1_listener) # execute dialog dlg_control.execute() dlg_control.dispose() return None g_exportedScripts = createDialog,
OpenOfficeは LF改行 のファイルしか受け付けない (※ OOo scripting framework and python の "Script coding" を参照)。したがって改行コー ドは、 必ず LF で保存すること。 Pythonマクロの編集にwindowsのメモ帳 を使ってはいけません。 メモ帳で保存してしまうと、改行コードが CR+LF になってしまうので注意!
コメントなどで日本語等の2byte文字を使用する場合、文字コードにも注意す ること。OpenOffice付属のPython2.3.4は、euc-jpに対応していない。 shift_jisはmbcsとして読み込んでくれそうだが、「shift_jis + LF改行」と いう組み合わせはかなりイレギュラーなので使わない方がいい。2byte文字を 含める場合は、ファイルの縁コーディングを「utf-8 + LF改行」にするのが無 難だと思う。emacsの場合「utf-8-unix」で保存するのがいいだろう。
このセクションでやったこと。
メニュー・バーの「ツール(T)」→「マクロ(M)」→「マクロを実行(U)」 をクリック。「マクロの選択」ダイアログが表示されます。
マクロの選択ダイアログの「ライブラリ(A)」から、「マイマクロ」→ 「simpledialog_test」を選択すると、「マクロ名(B)」に「createDialog」が 表示されます。次に、「createDialog」を選択して「実行ボタン」を押します。
うまくいっていれば、 ダイアログの作成 のセクションで作成・保存した ダイアログ「simpleDialog」が表示されているはずです。
ボタンを押してみましょう。ボタンを押すたびにテキストフィールドに表示さ れている数字が 1,2,3,4,5… と増加する事が確認できれば成功です。