============================ Python で OpenOfficeマクロ ============================ ---------------------------------------------------------- ダイアログ・エディタの利用とコード上でのイベント関連づけ ---------------------------------------------------------- .. meta:: :keywords: PyUNO, OpenOffice.org, Python, UNO, Macro, GUI :description lang=ja: OOoマクロをPythonで書く。OOoBASIC並みにお手軽 なGUI作成も実現。ダイアログ・エディタでGUIを作成し、コード内でイベ ント関連付けを行う。 .. contents:: 前置き ======== Pythonでダイアログのイベント操作をおこなうOOoマクロのサンプルには、 `OOo scripting framework and python`_ の `dynamicDialog.py`_ があるの ですが、ダイアログのレイアウトをコード内部でいちいち記述しているのが気 に入りません。 OOoBASICでは、 `DevelopersGuide`_ の `Basics and Dialogs`_ で解説されて いるような、「ダイアログ・エディタで作成したGUIを呼び出して利用する」 のが普通なようです。PythonでOOoマクロを記述する場合も、OOoBASICの場合 と同様に、ダイアログ・エディタを利用した「楽なGUI」をやりたいものです。 .. _`OOo scripting framework and python`: http://udk.openoffice.org/python/scriptingframework/ .. _`dynamicDialog.py`: http://udk.openoffice.org/python/scriptingframework/dynamicDialog.py .. _`DevelopersGuide`: http://api.openoffice.org/DevelopersGuide/DevelopersGuide.html .. _`Basics and Dialogs`: http://api.openoffice.org/docs/DevelopersGuide/BasicAndDialogs/BasicAndDialogs.html このテキストでは、OpenOfficeに付属しているダイアログ・エディタで作成し たGUIを利用するOOoマクロをPythonで作成します。ただし、イベントの関連付 けだけはコード内部に記述します。 UNO経由でのOOoの操作は言語によらずほぼ同じ手順です。ダイアログ操作を伴 うOOoマクロをJavascriptなどで作成する際にも、この文書が参考資料として 役立つとおもいます。 実際の手順 ============ ダイアログの作成 ----------------- OpenOffice.org Calc を立ち上げます。 メニュー・バーの「ツール(T)」→「マクロ(M)」→「ダイアログの管理(D)」 をクリック。「OpenOffice.org BASIC マクロの管理」というウィンドウが表 示されます。 .. figure:: images/pydy00.png :alt: 「ツール(T)」→「マクロ(M)」→「ダイアログの管理(D)」 「マイダイアログ」→「Standard」を選択(クリック)して、「新規作成 (N)」ボタンをクリック。ダイアログ名の入力を求める「新しいダイアログ」 という小さいウィンドウが表示されます。 .. figure:: images/pydy01.png :alt: 「simpleDialog」という名前の新しいダイアログを作成する 「新しいダイアログ」の「名前(N)」欄に「simpleDialog」と 入力して「OK」を押します。「マイダイアログ」→「Standard」の下に 「simpleDialog」という項目が作成されます。 .. figure:: images/pydy02.png :alt: 「simpleDialog」を選択して「編集」ボタンを押します。 「マイダイアログ」→「Standard」の下にある「simpleDialog」を選択して 「編集」ボタンを押す。「マイマクロ & ダイアログ.Standard - OpenOffice.org BASIC」という名前のウィンドウが表示されます。 .. figure:: images/pydy03.png :alt: ユーザー・ダイアログの作成画面 ツールボックスから、「コマンドボタン」 |commandbutton_icon| を選択し、 ダイアログにボタンを作成。ドラッグアンドドロップした大きさでボタンが作 成されます。 .. |commandbutton_icon| image:: images/commandbutton_icon.png ダイアログに作成したボタンをダブルクリック。ボタンのプロパティ・ダイア ログ「プロパティ: CommandButton」が表示されます。 「プロパティ: CommandButton」の「名前」欄を「CommandButton1」に設定。 (※デフォルトで「CommandButton1」のはずなので書き換える必要ないかも) 名前を設定したら「プロパティ: CommandButton」を閉じる。 .. figure:: images/pydy04.png :alt: ボタンのプロパティ。「名前」に「CommandButton1」を設定。 同様に、ダイアログへテキスト・フィールドを追加します。 ツールボックスから、「テキスト・フィールド」 |textfield_icon| を選択し、 ダイアログに作成。作成したテキストフィードをダブルクリックしてプロパ ティ・ウィンドウを開く。名前欄に「TextField1」を設定した後、プロパティ・ ウィンドウを閉じる。 .. |textfield_icon| image:: images/textfield_icon.png .. figure:: images/pydy05.png :alt: テキスト・フィールドのプロパティ。「名前」に「TextField1」を設定。 ボタンとテキストフィールドの追加が完了したら、ダイアログを保存します。 ダイアログを保存するには、ツールバーにあるフロッピーディスクのアイコン |notsaved_icon| をクリックします。ダイアログの保存が完了すると、 |saved_icon| のような灰色をしたフロッピーディスク・アイコンに変わります。 .. figure:: images/toolbar.png :alt: フロッピーディスクのアイコンを押して、デザインしたダイアログを 保存する。 .. |notsaved_icon| image:: images/notsaved_icon.png .. |saved_icon| image:: images/saved_icon.png ダイアログ・エディタでの操作はこれで終了。マクロから呼び出すダイアログ が完成しました。 まとめ ~~~~~~~~~ このセクションでやったこと。 - ダイアログ「simpleDialog」を作成。場所は「マイダイアログ」→ 「Starndard」以下 - ダイアログ上にボタンを配置。名前は「CommandButton1」 - ダイアログ上にテキスト・フィールドを配置。名前は「TextField1」 - ダイアログのデザインが完成したら保存する。 マクロコードの記述 -------------------- マクロコードを記述したPythonファイルを保存するために、 「C:\\Documents and Settings\\ユーザー名\\Application Data\\OpenOffice.org2\\user\\Scripts」 以下に「python」フォルダを作成します。(以下: Script\pythonフォルダと呼 ぶ) .. figure:: images/pydy06.png :alt: Script以下にpythonフォルダを作成して、pythonコードを配置する。 .. _`simpledialog_test.py`: simpledialog_test.py 以下のスクリプトを、「 **simpledialog_test.py** 」という名前で Script\python フォルダ に保存します。めんどうな場合は、 `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」で保存するのがいいだろう。 まとめ ~~~~~~~~ このセクションでやったこと。 - マクロファイルは 「C:\\Documents and Settings\\ユーザー名\\Application Data\\OpenOffice.org2\\user\\Scripts\\python」 に置く。 - 改行コードに注意。必ず LF改行 で保存する。 マクロの実行 ---------------- メニュー・バーの「ツール(T)」→「マクロ(M)」→「マクロを実行(U)」 をクリック。「マクロの選択」ダイアログが表示されます。 .. figure:: images/pydy07.png :alt: 「ツール(T)」→「マクロ(M)」→「マクロを実行(U)」 .. figure:: images/pydy08.png :alt: 「マクロの選択」ダイアログ マクロの選択ダイアログの「ライブラリ(A)」から、「マイマクロ」→ 「simpledialog_test」を選択すると、「マクロ名(B)」に「createDialog」が 表示されます。次に、「createDialog」を選択して「実行ボタン」を押します。 うまくいっていれば、 `ダイアログの作成`_ のセクションで作成・保存した ダイアログ「simpleDialog」が表示されているはずです。 .. figure:: images/pydy09.png :alt: simpleDialog ボタンを押してみましょう。ボタンを押すたびにテキストフィールドに表示さ れている数字が 1,2,3,4,5… と増加する事が確認できれば成功です。 .. figure:: images/pydy10.png :alt: CommandButton1 を押すと TextField1 の数字がカウントアップされる。