linuxBean14.04(96)Anaconda3のPyQtモジュールを使う

2016-01-10

旧ブログ

t f B! P L

前の関連記事:linuxBean14.04(95)Anaconda3にPySideをインストール


linuxBean14.04(95)Anaconda3にPySideをインストールしてからAnaconda 2.4.1 Package List — Continuum documentationをみてAnacondaにはデフォルトでPyQtがインストールされていることを知りました、、、ということでPySideを使うのはやめてPyQtを使うことにします。

Qt DesignerもAnaconda3ではデフォルトインストールされていた

pq@pq-VirtualBox:~$ conda list pyqt
# packages in environment at /home/pq/anaconda3:
#
pyqt                      4.11.3                   py34_1  
pq@pq-VirtualBox:~$ source activate py335
discarding /home/pq/anaconda3/bin from PATH
prepending /home/pq/anaconda3/envs/py335/bin to PATH
(py335)pq@pq-VirtualBox:~$ conda list pyqt
# packages in environment at /home/pq/anaconda3/envs/py335:
#
pyqt                      4.11.3                   py33_1  
linuxBean14.04(86)AnacondaのパッケージをLibreOfficeマクロで使うで作成したpy335にもpyqt 4.11.3がインストールされていました。

第5章 Qt Designerを使ってみよう | densan-labs.net

ここに書いてある通りTerminalでdesignerと打ち込むとQt Designer 4.8.6が起動しました。

Anaconda 2.4.1 Package Listにはqtは4.8.7が入っているはずですがpy335ではqtは4.8.6でした。

ということでpy34とともにconda update qtでqtを4.8.7にアップグレードしました。

Qt DesignerはPythonパッケージについてくると思ったのですがPyQtではなくtarでダウンロードされてインストールされるQtについてきたものでした。

rootであるpy34のqtを4.8.7にアップグレードするとQt Designerも4.8.7になりました。

でもついでに同様にしてpy335のqtも4.8.7にアップグレードしました。

py34をアップグレードしたあとなので具体的にやっていたのはpy335ではパッケージへのリンクの付け替えだけでした。

Qt Designerのランチャの作成に一苦労


Qt Designerを起動しやすいようにランチャを作成します。


アイコンは「未分類のアイコン」のなかで見つけたqtdesignerアイコンを使いました。

メニューエディタでプログラミングフォルダにランチャを登録しました。

ところがこれではランチャをダブルクリックしても起動しません。

「ターミナルで実行する」をクリックしてもダメです。

うーん。
pq@pq-VirtualBox:~$ whereis designer
designer: /usr/bin/designer /usr/bin/X11/designer
pq@pq-VirtualBox:~$ /usr/bin/designer
designer: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/designer': No such file or directory
pq@pq-VirtualBox:~$ /usr/bin/X11/designer
designer: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/designer': No such file or directory
うーん。

designerで起動するのにwhereisで探したフルパスでも起動しません。

xfce4-terminal -H -e "designer"

これでもdesigner: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/designer': No such file or directoryといわれて起動できません。


/home/pq/anaconda3/bin/designer

結局このコマンドをランチャから実行することにしてQt Designerをランチャから起動できました。

反省点:コマンドのパスを探すにはwhereisよりwhichを使うべき


/usr/bin/designerは/usr/bin/qtchooserをリンクしていて、/usr/bin/qtchooserは/usr/share/qtchooser/qt4-i386-linux-gnu.confを参照していて、そこに/usr/lib/i386-linux-gnu/qt4/binと書いてありました。

qtchooserはqtのバイナリを選択するプログラム(Ubuntu Manpage: qtchooser - a wrapper used to select between Qt development binary)でlinuxBeanインストール直後にはインストールされていませんでしたが、linuxBean14.04(2)linuxBean設定ウィザードでソフトウェアを追加するの時点ではインストールされていました。

ただその段階ではdesignerとコマンドを打ってもdesigner: could not exec '/usr/lib/i386-linux-gnu/qt4/bin/designer': No such file or directoryと言われました。

linuxBean14.04(72)Anacondaで科学技術系Pythonパッケージを一括インストールする以降でdesignerコマンドでQt Designerが起動するようになっていました。

ということでAnaconda3のインストールディレクトリ内を検索して~/anaconda3/bin/designerをみつけたわけです。

~/anaconda3/envs/py335/bin/designerもありましたがroot環境と同じqtバージョンなのでどちらを使っても同じでしょう。

Anacondaは~/anaconda3フォルダ以下だけにインストールされるはずなので、whereisで/usr/bin/designerが返ってきた時はおかしいな、と思ったのですが、Anaconda3インストール時に~/.bashrcで/home/pq/anaconda3/binにパスを設定したのでdesignerで~/anaconda3/bin/designerが起動するのは当然のことですね。

でも~/.bashrcはシェル内でのみ有効なのでランチャのコマンドではパスが通っておらずdesignerでは起動できないわけです。

以前からwhereisは役立たずと思っていたので改めてwhereisについて調べてみたら、whichとwhereisの違いって? | OpenGrooveという記事を見つけました。
pq@pq-VirtualBox:~$ which designer
/home/pq/anaconda3/bin/designer
pq@pq-VirtualBox:~$ whereis designer
designer: /usr/bin/designer /usr/bin/X11/designer
私が求める用途ではwhereisよりwhichの方が適しているようです。

初めからwhichを使っていればランチャ作りに苦労しませんでしたね。

PyQtでメッセージボックスを表示させる


PyQT4 Tutorials - Pythonspot (Python3への修正が必要な部分あり)

PyQt4 tutorial

PyQt - Wikipediaからたどってこんな便利そうなチュートリアルを見つけました。

QT4 Messagebox - Pythonspotをやってみます。

Python2のコードなので2to3でPython3のコードに変換します。

Terminalで2to3と実行するだけのことですがこの機会にlinuxBean14.04(26)Geanyのビルドコマンドの設定と同様にしてGeanyのビルドコマンドに設定してしまいます。


Geanyでpyファイルを開いてビルド→ビルドコマンドを設定。

Pythonコマンドのところに「2to3」という項目を作りコマンドに2to3 -w "%d/%f"を入力しました。

あとは変換したいpyファイルをGenayで開きビルド→2to3とするだけです。

もとには戻せませんので注意が必要です。

とりあえずインフォメーションボックスの表示をLibreOfficeのバンドルPythonをインタープリタにして実行してみました。
# -*- coding: utf-8 -*-
import sys
import PyQt4.QtGui as QtGui
app = QtGui.QApplication(sys.argv)
wdt = QtGui.QWidget()
QtGui.QMessageBox.information(wdt, "メッセージ", "インフォメーションボックスの表示")
wdt.show()
例に従うとこのあとにsys.exit(app.exec_())が続くはずなのですが、app.exec_()を実行するとスクリプトファイル名のウィンドウが表示されてしまいます。

PyQt - WikipediaのHellloWorldの例のなかのコメントでsys.exit(app.exec_())のところにメインループに入ると書いてあるのでメッセージボックスの表示のときはこれは不要なのかもしれません。


いい感じにメッセージボックスが表示されました。

LibreOffice5のマクロモードからPyQtのメッセージボックスを呼び出す


linuxBean14.04(95)Anaconda3にPySideをインストールでやったことと同様のことができるのかPyQtでも確認します。
# -*- coding: utf-8 -*-
import PyQt4.QtGui as QtGui
def pyqt_test():
    app = QtGui.QApplication(["macro"])
    wdt = QtGui.QWidget()
    QtGui.QMessageBox.information(wdt, "メッセージ", "インフォメーションボックスの表示")
    wdt.show()

うまくいきました。

ノンモダルになっていてマクロセレクタを閉じてもメッセージボックスは表示され続けます。


メッセージボックスを閉じないまま再度同じマクロを実行すると同じメッセージボックスが表示されました。

しかし一旦他のウィンドウの後ろに隠れたものを前に出すと、最新のメッセージボックス以外の中身は描かれていないウィンドウになってしまいます。


さらに中身が描画されていたとしても閉じるボタンをクリックすると応答がないとのことでLibreOffice自体が落ちてしまいます。

linuxBean14.04(95)Anaconda3にPySideをインストールのときと同様にしてappのインスタンスの有無を確認するようにしましたが今度は2つ目のメッセージボックスを開けるとメッセージボックスはあかずに強制終了するかと聞かれました。

メッセージボックスを閉じてから再度マクロを呼び出した場合は問題ありません。

メッセージボックスを閉じるとマクロセレクタも同時に閉じられました。

メッセージボックスがすでに開いているかどうかを検知して問題を回避できそうですが、ちょっといまのところやりかたがわかりません。


とりあえずPyQtのウィンドウからPyQtのメッセージボックスを開いているかの検知の例は見つけました。

参考にしたサイト


Anaconda 2.4.1 Package List — Continuum documentation
Anacondaのデフォルトパッケージリスト。pyqtもqtも入っています。

第5章 Qt Designerを使ってみよう | densan-labs.net
Qt Designerの使い方。シグナル/スロットの設定はPythonでは少し異なるようで次にやります。

Ubuntu Manpage: qtchooser - a wrapper used to select between Qt development binary
Anacondaでqtを使うときはqtchooserは関係ないようです。

whichとwhereisの違いって? | OpenGroove
コマンドのパスを探すにはwhereisよりwhichの方が役立ちそうです。

PyQT4 Tutorials - Pythonspot
PyQtの例。Python2で書いてあります。

PyQt4 tutorial
PyQtの例。

PyQt - Wikipedia
PyQtの例はここからのリンクから見つけました。

python - how to check if PyQt window exists - Stack Overflow
PyQtのメッセージボックスを開いているかの検知の例。

次の関連記事:linuxBean14.04(97)Qt4 Designerを使ってPythonのGUIを作る

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ