LibreOffice5(56)モードレスダイアログの例をPythonに翻訳する:その2

LibreOffice5(33)モードレスダイアログの例をPythonに翻訳する:その1の例では単純にモードレス(ノンモダル)なウィンドウを表示させるだけでした。今度はこのモードレスダイアログにコントロールを配置する例modelessdialog-2.odtをPythonにします。

前の関連記事:LibreOffice5(55)Javaの例:GUIをPythonにする その1


モードレスダイアログにコントロールを載せたマクロの例


OOoBasic/Dialog/Example10 - ...?のmodelessdialog-2.odtに入っているBasicマクロをPythonに翻訳しました。

modelessdialog2macro.py

このpyファイルをマイマクロフォルダに入れます。

Writerドキュメントを開いた状態でマクロセレクタでこのpyファイルにあるマクロを起動します。


モードレスダイアログが表示されます。

モードレスなのでダイアログが開いた状態のままでドキュメントの操作もできます。

ボタンをクリックするとテキストフィールドにBy Button Clickという文字列が入り、その文字列をメッセージボックスに表示させます。


メッセージボックスはモーダルダイアログなのでドキュメントの操作もその親ウィンドウのダイアログの操作も出来ませんがウィンドウの移動はできました。

メッセージボックスのタイトルの設定は反映されていますが、メッセージボックスの幅が足りないために一部しか表示されていません。

メッセージボックスのタイトルウィンドウにアイコンがすべて不要と思いますが、非表示にする方法はいまのところわかりません。

Calc(2)課題2:選択範囲の行列番号をメッセージボックスに表示でWindows7でやったときは「閉じる」ボタンしか表示されていないのでウィンドウマネージャの設定の問題かと思います。

モードレスダイアログのウィンドウタイトルも26行目で設定していますが、これはLibreOffice5(33)モードレスダイアログの例をPythonに翻訳する:その1でやったようにこの方法ではタイトルの変更はできないのでコメントアウトしています。

24行目のsetCreator()も実行しなくても27行目でフレームを追加したときに自動的に代入されるのでコメントアウトしています。

34行目のsetComponent()の第一引数に与えたウィンドウがフレームのコンポーネントウィンドウになります。

コントロールをまとめているコントロールコンテナ(UnoControlContainer)はXWindowインターフェイスを備えているのでコンポーネントウィンドウになることができます。

しかしXTopWindowインタフェースがないのでコンテナウィンドウになることはできません。

フレームコントローラモデルではコントローラはモデルを引きつれています(Frames - Apache OpenOffice Wiki)が、この例では特にモデルはないのでコントローラもなくsetComponent()の第二引数はNoneを与えています。

setComponent()でコンポーネントウィンドウにしなくても32行目でcreatePeer()でコントロールコンテナはコンテナウィンドウ上に描画されています。

わざわざコンポーネントウィンドウにしなくても動作には問題なさそうですが、フレームコントローラモデルの体裁を整えるように実行するようにしています。

コンポーネントウィンドウにするとgetComponentWindow()でフレームからコントロールコンテナを取得できるようになります。

メッセージボックスはcreateMessageBox()に渡す親ウィンドウの上の階層のウィンドウにだけモダルになる


57行目でcreateMessageBox()の第一引数に渡すオブジェクトはメッセージボックスの親になるウィンドウオブジェクトになります。

43行目でBtnListenerにインスタンス化するときにモードレスダイアログではなくてドキュメントウィンドウを渡すとメッセージボックスがドキュメントの中心に表示され、モードレスダイアログに対してメッセージボックスはモードレスになって、繰り返し重ねてメッセージボックスを表示できるようになります。

setVisible(True)の代わりにexecute()を実行するとモダルダイアログになる


44行目のsetVisible(True)に代わって45行目のexecute()を実行するとモダルダイアログになります。

このときはメッセージボックスも親ウィンドウの指定に関係なくすべてモダルになりました。

setVisible(True)は実行しなくてもモードレスダイアログとして表示されるのでコメントアウトしたままにしています。

TaskCreatorサービスでコンテナウィンドウ付きフレームを作成する方法


OOoBasic/Window/TaskCreator - ...?に載っている方法です。

LibreOffice: TaskCreator Service Referenceには全く解説は載っていませんが、TaskCreatorを使うとコンテナウィンドウをもったフレームが作成できます。

modelessdialog2macro.py
(2017.7.10追記GUI/modelessdialog2macro.py at cee32f9ea82cda9e42ad6e7e797ff2c6a264cadd · p--q/GUI
コメントの修正と描画中のダイアログは表示させないようにしました。)

TaskCreatorサービスを使うと、コンテナウィンドウとフレームを同時に作成できるので少々手間が省けます。

さらなるメリットとしてはフレームタイトル名を変更できます(24行目)。

TaskCreatorを使わない方法との違いはデフォルトでは表示されないようになっている点と、あとはコンテナウィンドウにはexecute()メソッドがないので、モダルダイアログに簡単に切り替えられない点です。

参考にしたサイト


OOoBasic/Dialog/Example10 - ...?
コントロールが載ったモードレスダイアログのBasicの例。

Frames - Apache OpenOffice Wiki
setComponent()でフレームにコントローラをつなげます。

OOoBasic/Window/TaskCreator - ...?
TaskCreatorサービスを使うとコンテナウィンドウ付きフレームを作成できます。

次の関連記事:LibreOffice5(57)モードレスダイアログの例をPythonに翻訳する:その3

PR

0 件のコメント:

コメントを投稿