Top > OOobbs2 > 74
** [[OOobbs2/74]] [#e1e3bbeb]
-''サマリ'': Python-UNO 関連
-''環境'': General
-''状態'': 投稿
-''投稿者'': [[はにゃ?]]
-''投稿日'': 2007-09-29 (土) 21:35:41
*** 質問 [#o323a1d7]
Python-UNO は海外ではよく利用されていますが日本ではさっぱりです。ユーザーが増えることを願ってすこしここで取り上げてみます。

#contents
*** 回答 [#d04bc34a]

***概要 [#x2bec0a3]
Python-UNO (Py-UNO) は Python-UNO ブリッジを介して python から OpenOffice.org API を利用する OOo-Python 間の仲立ちをしてくれます。単純に Python から OOo を操作できるとみなしてかまいません。

使い方は自分で調べるという人のためにいくつかページを挙げておきます。

-Python-UNO bridge
--http://udk.openoffice.org/python/python-bridge.html
-Python (OpenOffice.org Wiki)
--http://wiki.services.openoffice.org/wiki/Extensions_development_python
-OOoPython
--[[OOoPython]]
-Script locations
--http://udk.openoffice.org/python/scriptingframework/index.html
-Python 2.5 へのアップデート関連 issue
-http://www.openoffice.org/issues/show_bug.cgi?id=71327

Python-UNO ブリッジは C++ で書かれたコードなので高速に動作します。また、スクリプトの実行速度は OOo Basic と比較できないほど早いです (C++、Java などとは比較しません)。

OpenOffice.org の Windows パッケージではわざわざ取り除かなければ Python が一緒にインストールされます。Python 2.3.4 の実行環境がついてきます。

また、Linux などの環境では Py-UNO パッケージをインストールしておく必要があります。

拡張機能として配布できるようにするのであればいまのところ Python 2.3.4 で動作するコードを書く必要があります。
***Py-UNO でできること [#w59468b2]
Py-UNO では次の三種類のことができます。
-Scripting Framework スクリプトのマクロとして動作
-UNO コンポーネント作成
-Py-UNO bridge を介して外部 Python から OOo オートメーション

マクロとしてというのは、OOo Basic で書いたマクロのように実行できるということです。また、UNO コンポーネント作成は新しいサービスを実装できます。Py-UNO bridge を介してというのは、OOo と関係の無い Python スクリプトからドキュメントを作成するために OOo を利用できることになります。

//***その他 [#w79e3cf5]

//OOo Con 2007 のスライドを見ていると Python を利用した ConfigurationManager
//-http://marketing.openoffice.org/ooocon2007/programme/thursday__170.pdf

//この中で Why Python? "It's cooler than StarBasic." や "Hight-level data types like dictionaries etc." とあります。
**各種取得 [#kaa762da]

各種いろいろなものを Py-Uno で利用する方法。OOo Basic で行う場合と対比させてみます。

uno や unohelper は OOo の program ディレクトリに置かれています。利用に際して import しておきます。

 import uno
 import unohelper

***XSCRIPTCONTEXT [#x2a62fa2]

Scripting Framework のスクリプトで使われる XSCRIPTCONTEXT グローバル変数は Py-UNO でも利用できます。これを使うのはマクロとして実行するときです。

現在のドキュメントを取得します。
 XSCRIPTCONTEXT.getDocument()
 
 StarDesktop.getCurrentComponent() 'OOo Basic
デスクトップ com.sun.star.frame.Desktop サービスを取得します。
 XSCRIPTCONTEXT.getDesktop()
 
 StarDesktop 'OOo Basic
 CreateUnoService("com.sun.star.frame.Desktop") 'another
コンポーネントコンテキストを取得します。
 XSCRIPTCONTEXT.getComponentContext()
 
 GetDefaultContext() 'OOo Basic

***サービスマネージャ [#ff55347d]
MultiServiceFactory を利用するには次のようにします。ctx はコンポーネントコンテキストです。

 smgr = ctx.ServiceManager

 oServiceManager = GetProcessServiceManager() ' OOo Basic
***サービス [#b528d707]

サービスマネージャから createInstanceWithContext メソッドで作成します。

 desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)

 oDesktop = CreateUnoService("com.sun.star.frame.Desktop") 'OOo Basic
***struct [#maceb9a8]

 struct の作成
 uno.createUnoStruct("com.sun.star.awt.Size")
OOo Basic では
 CreateUnoStruct("com.sun.star.awt.Size")
や Dim ... New As ...

***enum [#o8363580]

enum は import します。
 from com.sun.star.awt.WindowClass import TOP as UNO_WC_TOP
また、次のようにも出来ます。
 uno.Enum("com.sun.star.awt.WindowClass","TOP")

OOo Basic では
 nEnum = com.sun.star.awt.WindowClass.TOP
With ステートメントも利用できます。
***Constants [#bb6344c5]

enum 同様に import します。
 from com.sun.star.beans.MethodConcept import ALL as UNO_MC_ALL
また、
 uno.getConstantByName("com.sun.star.beans.MethodConcept.ALL")
OOo Basic は enum と同様。

***配列 [#a0a5e59e]

配列というより UNO の sequence 型。API 関数から戻される sequence は Py-UNO ではタプルになります。また、メソッドの引数として与えるときもタプルで与えます。tuple、list などで必要に応じて変換したりしなければいけません。

 edit_model.setPropertyValues(
   ("MultiLine",),
   (True,) )

 oEdit_model.setPropertyValues( _
   Array("MultiLine"), Array(true) ) ' OOo Basic

***boolean [#s48fefad]
 True または False

OOo Basic だと大文字と小文字に依存しませんが、python だと syntax error になります。
***string [#we8b94e2]

文字列は python unicode。8 bit を与えたときは自動的に変換されます。
***URL <-> System FilePath [#g8257503]

システムパスから URL 
 unohelper.systemPathToFileUrl( systemPath )
URL からシステムパス
 unohelper.fileUrlToSystemPath( url )

***ダイアログ [#k28f0023]

com.sun.star.awt.DialogProvider サービスを利用してダイアログエディタで作成したダイアログが利用できます。ボタンなどのリスナーは UNO コンポーネントを設定していないのであればリスナーを設定する必要があります。

 def dialog_test():
 	ctx = XSCRIPTCONTEXT.getComponentContext()
 	smgr = ctx.ServiceManager
 	dialogprovider = smgr.createInstanceWithContext(
 	   "com.sun.star.awt.DialogProvider",ctx)
 	url = "vnd.sun.star.script:Standard.Dialog1?location=application"
 	dialog = dialogprovider.createDialog(url)
 	dialog.execute()

***実行するスクリプト一覧に表示する関数名 [#h14f3d66]

OOo で python スクリプトをマクロとして実行するときは関数定義を実行する形になります。一覧に表示したい名前を制限するには次のようにします。

 g_exportedScripts = calc_thread,
タプルで表示したい関数名を指定します。g_exportedScripts の変数名を変えてはいけません。

#comment
*** 感想,コメント,メモ [#d09a2cb8]

#comment

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes