2016/11/25(金) [n年前の日記]
#1 [python] PySideとPyQt4を両方入れているとImageQtがエラーを出す問題
PySide を使って書いていたスクリプトが、エラーを出すようになって悩んだり。
Pillow(PIL)の ImageQt を使うと、PIL の Image を PySide の QImage に変換できる、はずなのだけど、何故か該当行でエラーが出てしまって。こないだまで動いてたのに変だな変だなと。
考えてみたら、各種サンプルを動かすために PyQt4 をインストールしてから、この症状が出始めたような…。試しに PyQt4 をアンインストールしてみたら、エラーが出なくなった。
以下のページで、同様の不具合報告と回答があった。
_python - cannot use imageQt to cast Image to QImage - Stack Overflow
PIL の ImageQt は、PyQt を使ってることを前提に書かれているので、PySide と PyQt の両方が入ってる環境では PyQt のほうを優先して使おうとして、PySide を使ったスクリプトではエラーが出てしまうらしい。
一行入れると問題回避できるかも、と書いてあったので試してみたり。
たしかに、1行入れてみたらエラーが出なかった。とメモ。
Pillow(PIL)の ImageQt を使うと、PIL の Image を PySide の QImage に変換できる、はずなのだけど、何故か該当行でエラーが出てしまって。こないだまで動いてたのに変だな変だなと。
考えてみたら、各種サンプルを動かすために PyQt4 をインストールしてから、この症状が出始めたような…。試しに PyQt4 をアンインストールしてみたら、エラーが出なくなった。
以下のページで、同様の不具合報告と回答があった。
_python - cannot use imageQt to cast Image to QImage - Stack Overflow
PIL の ImageQt は、PyQt を使ってることを前提に書かれているので、PySide と PyQt の両方が入ってる環境では PyQt のほうを優先して使おうとして、PySide を使ったスクリプトではエラーが出てしまうらしい。
一行入れると問題回避できるかも、と書いてあったので試してみたり。
u""" Pillow(PIL)のImageQtについて動作確認. 動作確認 : Windows10 x64 + Python 2.7.12 + PySide 1.2.4 """ from PySide import QtGui import sys from PySide.QtCore import * # NOQA from PySide.QtGui import * # NOQA sys.modules['PyQt4.QtGui'] = QtGui # PyQt4を使わないようにしている from PIL import Image from PIL import ImageQt class MyWidget(QWidget): """main window.""" def __init__(self, *argv, **keywords): """init.""" super(MyWidget, self).__init__(*argv, **keywords) img = Image.open("./tmp_00_default.png") img = img.convert("RGBA") qimg = ImageQt.ImageQt(img) pm = QPixmap.fromImage(QImage(qimg)) lbl = QLabel(self) lbl.setPixmap(pm) self.setLayout(QVBoxLayout()) self.layout().addWidget(lbl) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.show() sys.exit(app.exec_())
たしかに、1行入れてみたらエラーが出なかった。とメモ。
[ ツッコむ ]
#2 [python] PySideのアレコレをメモ
PySide関係のアレコレをメモ。
◎ QGraphicsSceneで表示してるアレコレの透明度。 :
QGraphicsView + QGraphicsScene に表示しているアイテムの透明度は、
_setOpacity
で変更できる。指定できる値は、0.0〜1.0。0.0が透明で、1.0が不透明。
◎ ウィジェットの隙間を少なくしたい。 :
PySideを使ったスクリプトを書いてたら、メインウインドウの大きさが、かなり大きくなってしまって。このままでは、例えば1366x768ドットのデスクトップ上で実行すると、はみ出して表示されてしまう…。
安いノートPCはえてして1366x768ドットの液晶を使ってるので、そのあたりの解像度が最低ラインだろうと。この解像度からはみ出してしまうようではマズい。 *1 ということで、アプリのウインドウサイズ、特に縦幅を小さくしないといけないなと。
とりあえず、 _QVBoxLayout の、中に入るウィジェットの隙間を小さくしていくことに。 _setSpacing() を呼ぶことで、隙間のドット数を指定することができる。0〜2ドットぐらいを指定してみたら、結構小さくなってくれた。
更に、Q*Layout の周囲の余白も少なくする。 _setContentsMargins() を使えば、周辺の余白を調整することができる。
これでようやく、ウインドウの縦幅を740ドットぐらいまで小さくできた。
ちなみに、今回書いてるアプリに特化すれば、別の策はいくつか思いつく。
安いノートPCはえてして1366x768ドットの液晶を使ってるので、そのあたりの解像度が最低ラインだろうと。この解像度からはみ出してしまうようではマズい。 *1 ということで、アプリのウインドウサイズ、特に縦幅を小さくしないといけないなと。
とりあえず、 _QVBoxLayout の、中に入るウィジェットの隙間を小さくしていくことに。 _setSpacing() を呼ぶことで、隙間のドット数を指定することができる。0〜2ドットぐらいを指定してみたら、結構小さくなってくれた。
更に、Q*Layout の周囲の余白も少なくする。 _setContentsMargins() を使えば、周辺の余白を調整することができる。
これでようやく、ウインドウの縦幅を740ドットぐらいまで小さくできた。
ちなみに、今回書いてるアプリに特化すれば、別の策はいくつか思いつく。
- 今は左側のドックだけを使って各種設定項目を並べているけど、右側のドッグにいくつか項目を引っ越しして表示する。ウインドウの横幅は無駄に(?)大きくなるけど。
- ツールバーを上部に並べるのではなく、スクリプト起動時から左側に、縦一直線に並べることができれば…。だけど、そんなことできるのかな?
- パレット表示部分と、RGB・HSLスライダー部分を、タブ表示で切り替える、という手もある。けれど、できればそこは両方を同時に表示しておきたいわけで。
- むしろ、ブラシ種類一覧部分を隠せるようにしておいたほうがいいのかも。例えばGIMPは、ブラシのオプション設定と、ブラシ種類一覧が分離しているし。絶えず同時に表示しておかないと使い勝手が悪くなるわけではない、ということだろう。
- 設定関係部分を、スクロールエリアに入れてしまう。ただ、目的の個所を表示・操作するのが面倒になる。
- MDI風の見た目にしてしまう。
*1: もっとも、自分の手持ちのノートPC(昔、ネットブックと呼ばれてたソレ)は、画面解像度が 1024x600 だったりするので、本当はそのくらいを最低ラインとして考えておくべきかもしれない。けど、さすがに今時、その解像度では実用にならないだろうし、そういうPCについては考えなくてもいいのかもしれない。そのあたりの解像度の液晶を使ってるPCは、CPUもGPUもスペックは期待できないので、その手のスクリプトも満足な速度で動かないだろうし。
[ ツッコむ ]
以上、1 日分です。