LibreOffice5(21)ダイアログエディタでGUIを作成しPythonで利用する:その1

2016-01-11

旧ブログ

t f B! P L

前の関連記事:LibreOffice5(20)Anaconda3のtkinterモジュールを使う


LibreOfficeのダイアログエディタを利用するにはBasicの取得が必須と思い込んで敬遠してましたがPython で OpenOfficeマクロ : ダイアログ・エディタの利用とコード上でのイベント関連づけを読むとBasicは使わなくてもできるようなので挑戦してみました。

LibreOfficeでダイアログを新規作成する


ツール→マクロ→ダイアログの管理。


「新規作成」をクリック。


新しいダイアログ名を入力して「OK」。


マイダイアログのStandardの下に新しいダイアログDialog2が作成されました。

これを選択したまま「編集」ボタンをクリック。


ダイアログ上の載せるコントロールはツールボックスから選択するのですが、最初はリストになっていて使いにくいのでリストの一番下のバーをドラッグして別のウィンドウにだします。

そのままウィンドウ下までドラッグするとウィンドウ枠下部にツールバーが表示されます。


コントロールを配置するにはツールボックスで選択して、編集中のダイアログ上でドラッグするとコントロールが載ります。

VirtualBoxのゲストOSではプロパティ名の表示が消える



編集中のダイアログ上のコントロールを選択すると左下のプロパティウィンドウにコントロールのプロパティが表示されるのですが、そのプロパティ名のラベルが表示されない時があります。

スクロールとかすると表示が戻りますが一定せず結構面倒です。

LibreOffice bugs list

バグ報告はされていますが同じOSでも再現性が取れないとのことでwindowsテーマとの相性が疑われています。

とりあえずlinuxBean14.04ではlinuxBean14.04(6)LibreOffice4.3.7とPyCharmの設定のLibreOffice4.3.7でもlinuxBean14.04(25)NetBeans8とLibreOffice5のインストールのLibreOffice5.0.0.0beta1でも現在使っているLibreOffice5.0.2.2でもすべて同じ問題が発生します。

いずれもVirtualBoxのゲストOSです。
(2015.1.13追記HP6730bにlinuxBean14.04をインストールのLibreOffice5.0.3.2では問題は起きないのでVirtualBoxのゲストOSでの固有の問題と思います。)

言語を日本語から英語に切り替えても同じ結果です。

まあ最初にプロパティの勉強をするにはちょっと不便ですね。

このまま使おうと思いましたがやっぱりかなり不便なのでlinuxBeanのテーマを変更してみます。

豆ボタン→設定→Openbox Configuration Manager。


うーん。まずデフォルトの現在のテーマがわかりませぬ。

テーマを選択した瞬間にもう切り替わるのでどれがデフォルトかわからなくなってしまいました。

デフォルトはClearlooksかClearlooks-Phenixぐらいでしょうか。

とりあえずBear2に変更してみました。

解決しません。

こんなことでは解決しそうな気がしないのでテーマはClearlooksにしました。

マウスカーソルを動かすだけで表示が戻る時もありますね。

描画が極端に遅いだけかと思って何もせずにじっと待っていましたがそれでは何も変化しません。

いまのところは解決策がわかりません。

ダイアログエディタでGUIを作成する


linuxBean14.04(97)Qt4 Designerを使ってPythonのGUIを作るで作ったHello Worldプログラムと同じようなものを作ってみます。

ツールボックスからラベルコントロールを選択して上部に配置します。

プロパティの「タイトル」に「Hello World プログラム」と入力してEnterキーを押します。


「配置」を「中央揃え」に変更しました。

この「配置」はラベルコントロールの中での相対的位置を示します。

次にその下にボタンコントロールを配置しました。


これもタイトルを「ここをクリック」に変更しました。

さらにその下部にテキストボックスコントロールを配置しました。


これのプロパティは変更しませんでした。

これらコントロールの「名前」はあとでPythonコードからこれらを利用するのに用います。


ダイアログエディタ上ではこのように見えています。

ラベルの背景を灰色、テキストボックスの背景を白色にしたいと思いましたが、これは設定変更しなくてもプレビュー画面ではそうなりました。


プレビュー画面はツールボックスの「テストモードオン/オフ」ボタンをクリックすると表示できます。


ここまでできたらファイル→保存、します。

Pythonから作成したGUIを利用する


マイマクロフォルダに作成したGUIを利用するPythonスクリプトを書きます。
import uno
import unohelper
from com.sun.star.awt import XActionListener
class MyActionListener(unohelper.Base, XActionListener):  # リスナを作成するクラス。
    def __init__(self, ctrl):  # リスンするコントロールオブジェクトを引数に取る。
        self.ctrl = ctrl
    def actionPerformed(self, evnt):  # リスンされるコントロールオブジェクトから呼び出されるメソッド。
        self.ctrl.setText("Hello World")  # リスンするコントロールにテキストを渡す。
def createDialog():
    dialog_name = "Dialog2"  # ダイアログエディタで作成したダイアログ名。
    localctx = uno.getComponentContext()  # ローカルコンポーネントコンテクストを取得。(オートメーションで実行するときはXSCRIPTCONTEXTからコンポーネントコンテクストの取得が必要。)
    dp = localctx.getServiceManager().createInstanceWithContext("com.sun.star.awt.DialogProvider", localctx)  # ローカルコンポーネントコンテクストからcom.sun.star.awt.DialogProviderサービスをインスタンス化。
    dlg_ctrl = dp.createDialog("vnd.sun.star.script:Standard."+dialog_name+"?location=application")  # コマンドURLでダイアログエディタで作成したダイアログを取得。
    tf1_ctrl = dlg_ctrl.getControl("TextField1")  # ダイアログのTextField1(テキストフィールド)という名前のコントロールを取得。
    btn1_listener = MyActionListener(tf1_ctrl)  # TextField1をリスンするコントロールとしてリスナを作成。
    cmdbtn1_ctrl = dlg_ctrl.getControl("CommandButton1")  # ダイアログのCommandButton1(ボタン)という名前のコントロールを取得。
    cmdbtn1_ctrl.addActionListener(btn1_listener)  # ボタンにリスナを登録してボタンのイベントをリスナでリスンする。
    dlg_ctrl.execute()  # ダイアログを表示。
    dlg_ctrl.dispose()  # オブジェクトのリソースを解放。
マクロセレクタからこのcreateDialogマクロを呼び出すと作成したダイアログが表示されます。

ダイアログのボタンをクリックするとそのボタンに登録されているリスナがリスンしているテキストフィールドに「Hello World」と入力します。

xdlファイルを直接編集してダイアログのウィンドウタイトルを設定する


OOoBasic/Dialog/CreateDialog - ...?を読んでダイアログエディタで作成したダイアログをマウスでドラッグして選択してプロパティで「タイトル」を編集するとダイアログのウィンドウタイトルを編集できると思ってやってみました。


プロパティに「タイトル」という項目が見つかりません。

ウィンドウタイトルは変更できないのかと思いましたが、「LibreOfficeのマクロ&ダイアログ」の例をみると例えばEuroのDlgPasswordとかウィンドウタイトルが設定されている例があります。

ダイアログエディタで編集しているのはxdlファイルなのでDlgPasswordダイアログのxclファイルをみてみます。

/opt/libreoffice5.0/share/basic/EuroにあるDlgPassword.xdlをChromeで開きます。
<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="DlgPassword" dlg:left="77" dlg:top="93" dlg:width="310" dlg:height="65" dlg:closeable="true" dlg:moveable="true" dlg:title="DlgPassword">
これのdlg:title="DlgPassword"というのがウィンドウタイトルと思われます。

そこで~/.config/libreoffice/4/user/basic/StandardにあるDialog2.xdlファイルを直接Geanyで編集してdlg:title="HelloWorldウィンドウ"を追記して保存しました。

xdlファイルの変更を反映されるためにはLibreOfficeの再起動が必要でした。


ウィンドウタイトルが設定できました。


プレビュー画面ではウィンドウタイトルは中央揃えになりました。

参考にしたサイト


Python で OpenOfficeマクロ : ダイアログ・エディタの利用とコード上でのイベント関連づけ
LibreOfficeでもダイアログエディタを使うと簡単にLibreOfficeのGUIを利用できました。

LibreOffice bugs list
ダイアログエディタのプロパティウィンドウのラベル名が消えるバグがあります。

次の関連記事:LibreOffice5(22)ダイアログエディタでGUIを作成しPythonで利用する:その2

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ