読者です 読者をやめる 読者になる 読者になる

PyQtで100個のスライダーを並べる

python

このエントリーをはてなブックマークに追加

PythonGUIツールキット

PythonGUIアプリを作るためのライブラリを調べました。QtのPythonバインディングとしてはPyQtとPySideが有名なようです。特徴を比較すると以下のようになります。

ツールキット 開発元 ライセンス 備考
PyQt4 Riverbank Computing GPLv3 / Commercial Python 2/3両対応。サポートは2015年末まで
PyQt5 Riverbank Computing GPLv3 / Commercial Python 3のみ対応
PySide Nokia LGPL

今はPyQt5の練習をしています。

PyQt5のチュートリアル

PyQt5 tutorialが非常に分かりやすいです。1つずつ新しい要素を取り上げているので混乱せず無理せず学習できます。

習作「100個のスライダー」

練習として100個のスライダーを並べたウィンドウを作ってみました。どれかのスライダーを動かすと、他の99個のスライダーが連動して動きます。

f:id:minus9d:20150328181155p:plain

ソースコードは以下の通りです。

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

import sys
from PyQt5.QtWidgets import (QWidget, QSlider, QGridLayout, 
    QPushButton, QApplication)
from PyQt5.QtCore import Qt


def return_widget(idx):
    idx = idx % 2
    if idx == 0:
        return QSlider(Qt.Horizontal)
    elif idx == 1:
        return QSlider(Qt.Vertical)

class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        # widgetを作る
        widgets = [ [None for j in range(10)] for i in range(10) ]
        for j in range(10):
            for i in range(10):
                widgets[j][i] = return_widget(i+j)

        # connectする
        H = 10
        W = 10
        for j in range(H):
            for i in range(W):
                if i == W-1:
                    i2 = 0
                    j2 = (j + 1) % W
                else:
                    i2 = i + 1
                    j2 = j
                widgets[j][i].valueChanged.connect(widgets[j2][i2].setValue)

        # gridに配置
        grid = QGridLayout()
        self.setLayout(grid)
        for j in range(H):
            for i in range(W):
                grid.addWidget(widgets[j][i], j, i)
                
        self.move(300, 150)
        self.setWindowTitle('Too Many Sliders')
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())