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

2017-07-09

旧ブログ

t f B! P L
リスナーのメソッドをPyDevのデバッガでブレークするときにいくつかの問題に突き当たりました。さらにPythonのオートメーションではリスナーを発火できないこともわかりました。

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


リスナーのメソッドはリモートデバッグでブレークしないといけない


Javaの例ではNetBeansでリスナーのメソッドにブレークポイントを設定できたのに、Pythonではリスナーのメソッドにブレークポイントを設定してもブレークされませんでした。

Javaではインターフェイスを実装するだけでリスナークラスを作成できますが、PyUNOではリスナーのインターフェイスだけでなく、XInterfaceも実装して、UNOコンポーネントとしてリスナーを実装しないといかないという違いが原因だと思われます。

そこでlinuxBean14.04(159)unohelper.ImplementationHelper()をデバッガにかけると同様にしてpydevdへのパスを貼った後に、リスナーのメソッドの中に import pydevd; pydevd.settrace()を挿入したらそこでブレークできました。

手順としては、ソースをEclipseから起動してダイアログをだして、PyDevのデバッグサーバーを起動した状態でコントロールを起動します。

ちょっと待ってデバッグパースペクティブをみるとデバッグコードのところでブレークされているはずです。

 PyUNOではリスナーはUNOコンポーネントになっているので、リモートコンテクストで起動したプロセスとは違うプロセスになっているので、ブレークできないわけです。

リスナーのメソッド内のprint()の出力が見れない


JavaではリスナーはUNOオブジェクトになっていないのでSystem.out.println()の出力をNetBeansの出力タブで見ることができます。

UnoDialogSample.javaのtextChanged() メソッドの中の1123行目のTextField1はTextFieldの間違いなのでこれを修正してUnoDialogSample.javaを起動して、出てきたダイアログの「My FixedLine」の下の枠のアスタリスク部分を編集してみます。

するとNetBeansの出力タブに枠に入っていた文字列が出力されます。

ところがPythonではリスナーのメソッドの中で実行したprint()の出力は見ることができませんでした。

これも原因はリスナーのメソッド内にブレークポイントが設定ができないのと同様にリスナーがUNOオブジェクトになっているからです。

LibreOffice5(45)拡張機能内で発生した例外の出力先で拡張機能内のprint()の出力を見ることができないのと同じ問題です。

オートメーションではモードレスダイアログのボタンが反応しない


LibreOffice5(56)モードレスダイアログの例をPythonに翻訳する:その2のPythonマクロをオートメーションで動かすとモードレスダイアログのボタンが動かないことに気が付きました。

modelessdialog2.py

execute()を実行してモダルダイアログにするとちゃんとボタンが反応します。
(しかし、モダルダイアログとしてオートメーションで実行するとLibreOfficeがクラッシュします。LibreOffice5(59)モードレスダイアログの例をPythonに翻訳する:その5参照。)

TaskCreatorから作成したフレームから取得したコンテナウィンドウにはexecute()メソッドがないので、ボタンが反応するダイアログを作成することはできません。

リスナーのメソッドにデバッグコードを仕掛けても反応しないので、リスナーのメソッドが呼ばれていないということがわかります。

OOoBasic/Window/Splitter - ...?

このEditコントロールの区切りを動的に変更できる例でもexecute()をやめてモードレスダイアログにしてオートメーションで実行するとリスナーが動かなくなりました。

GUI/splitter.py at 4a4de58ec119a1f8d83f010067ecff0f54539ea2 · p--q/GUI

モードレスダイアログにするとウィンドウの閉じるボタンも動きませんでした。

mouseDragged()メソッドは同じPCではGUIでデバッグできない


splitter.pyのmouseDragged()メソッドにデバッグコードを挿入してブレークしようとしましたが、Eclipseが操作できない問題にぶち当たりました。


マウスで区切りを動かそうとするとimport pydevd; pydevd.settrace()のところでブレークできます。

しかしマウスカーソルがリサイズ用のままで戻らないのでマウスでEclipseの操作ができません。

PyDevのショートカットを試してみましたが、反応せずOS自体も反応せず結局OSを再起動するしかありませんでした。

XMouseMotionListenerインターフェイスのメソッドをGUIでデバッガするにはlinuxBean14.04(136)WindowsのLibreOfficeマクロをlinuxBeanでリモートデバッグするでやったように他のPCからデバッガをつなぐしかなさそうです。

参考にしたサイト


OOoBasic/Window/Splitter - ...?
細いウィンドウを区切りにして動的にEditフィールドを変更する例です。

PyDev Shortcut Cheat Sheet Cheat Sheet by WaltheRed - Download free from Cheatography - Cheatography.com: Cheat Sheets For Every Occasion
PyDevのキーボードショートカット一覧。

虎の備忘録: Ubuntu  フリーズした Ubuntu から安全に再起動する方法
Ubuntuがフリーズしたときの対応方法。

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

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ