PySide

pythonでGUIを構築するためのライブラリ(ツールキット)はTkinter、wxPython、PyQt、PySide、PyGTK、PyGame等色々と存在しているが、種類が多くなると何を使うべきなのか悩むことになるし、ネット上での情報が分散してしまうので選択肢が多いのは良いことばかりとは限らない。

最も手軽に利用できるのは標準でPythonに含まれているTkinterで、何もインストールせずに使えるし単純なGUIならコードも短く書ける。その反面複雑なGUIになると思ったようにデザインするのが難しいという印象。これについては以前使ってみたPyGameでも似たような感じだったので、VisualStudioのようなインタラクティブにコントロールを配置できるリソースエディタが用意されているものという基準で選択すると、wxPythonとQt(PyQt、PySide)が良さそうに思える。サンプルコードの量などもその二つが豊富なようだ。

今回はその中からPySideを使ってみる事にした。同じQtのPythonバインディングであるPyQtではなくPySideを選んだのはライセンスの違いによるものだが、個人的に使うにはあまり気にしなくても良いかもしれない。機能的にはPyQtのほうが先行していて、コミュニティベースのPySideがその後を追うというのが現状らしいが、wxPythonの開発者がPySideの開発に加わったりと目まぐるしく状況が変化しているので、この先どうなるかは分からない。

QtにはQt DesignerというGUIコントロールを配置するためのリソースエディタが存在していて、PySideを使ってみようと思ったのはそれも理由の一つなのだが、最初はそれを使わずにコードだけでGUIアプリを作成してみた。

まず最初にPySideのインストールだが、Pyhton3では

$ sudo apt-get install python3-pyside

で簡単に行える。しかし、virtualenvでPythonの仮想環境を構築してある場合、このインストール方法では仮想環境下に追加されない。apt-getではなくpipでインストールすれば仮想環境下に追加されるはずなのだが、pipでのインストールは上手く行かなかった。ソースからのビルドも試してみたがやはりダメ。

import sys
sys.path.append('/usr/lib/python3/dist-packages')

と記述しておけば元のパッケージを参照できるようになるので、あまりスマートな方法ではないがとりあえずはこれで動かしておく。

Raspberry Piでやるからには何らかのハードを動かさないと面白く無いので、aitendoの100円コーナーで買った極小フルカラーLEDモジュールをGPIOに接続した。GPIOの制御にはQuick2Wireを使う。
画像1: 極小フルカラーLEDモジュール

RGBの三個のLEDが内蔵されていて、3ビットで7色の表示ができる。PWMを使えばもっと微妙な色の表現も可能だが、今回はそこまではやらない。

ウィンドウにボタンを三個表示させて、クリックするとRGBそれぞれをON/OFFできるようにした。接続はGPIO0(ピン番号17)をR、GPIO1(ピン番号18)をG、GPIO2(ピン番号27)をBに割り当てる。プログラムは以下の通り

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
sys.path.append('/usr/lib/python3/dist-packages')
from PySide import QtCore, QtGui
from quick2wire.gpio import pins, Out

class ColorLED:
    led = [pins.pin(0, direction=Out),
           pins.pin(1, direction=Out),
           pins.pin(2, direction=Out)]
    def __init__(self):
        for e in self.led:
            e.open();
    def __del__(self):
        for e in self.led:
            e.close();
    def set(self, color):
        self.led[0].value = color & 0x01
        self.led[1].value = color & 0x02
        self.led[2].value = color & 0x04

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)    
        self.btn_r = QtGui.QPushButton('RED')
        self.btn_g = QtGui.QPushButton('GREEN')
        self.btn_b = QtGui.QPushButton('BLUE')
        layout = QtGui.QHBoxLayout()
        layout.addWidget(self.btn_r)
        layout.addWidget(self.btn_g)
        layout.addWidget(self.btn_b)
        self.setLayout(layout)
        self.setMinimumSize(400, 100)
        self.btn_r.clicked.connect(lambda: self.click_btn(0x01))
        self.btn_g.clicked.connect(lambda: self.click_btn(0x02))
        self.btn_b.clicked.connect(lambda: self.click_btn(0x04))
        self.led = ColorLED()
        self.color = 0
    def click_btn(self, n):
        self.color = self.color ^ n
        self.led.set(self.color)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

実行するとこのように表示される。

Raspberry Pi_001

次回はQt Designerを使ってもう少し複雑なGUIを作ってみる予定。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中