大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

ラズパイデスクトップでPyQt5入門(13)Widgets(2)

著者:國松亜紗子
公開日:2019/12/23
最終更新日:2019/12/23
カテゴリー:技術情報

こんばんは。國松です。
昨日あたりから一段と寒くなりました。体調管理にはお気をつけ下さい。

今回はPyQt5のQSliderとQprogressBarをみていきたいと思います。
参考サイト
ZetCode PyQt5 tutorial
【PythonでGUI】PyQt5 -始めの一歩-

3.QSlider
QSliderはシンプルなハンドルを持つWidgetsです。ハンドルを動かす事で特定のタスクの値を選択していきます。
今回は1つのスライダーと1つのラベルを作成していきます。スライダーはラベルに表示される画像を制御します。
ラベルに表示させる画像(音量のアイコン)はフリーのアイコンを使用しています。画像はslider.pyと同じディレクトリにおいて下さい。それぞれの画像の名前はサンプルコードと同じにしています。

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

"""
This example shows a QSlider widget
"""

from PyQt5.QtWidgets import (QWidget,QSlider,QLabel,QApplication)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #水平スライダーを作成
        sld = QSlider(Qt.Horizontal,self)
        #スライダーがフォーカスされないようにする
        sld.setFocusPolicy(Qt.NoFocus)
        sld.setGeometry(30,40,100,30)
        sld.valueChanged[int].connect(self.changeValue)
        
        #QLabelウィジェットを作成    
        self.label = QLabel(self)
        #ラベルの初期値にミュートの画像を設定
        self.label.setPixmap(QPixmap('mute.png'))
        self.label.setGeometry(160,40,200,200)

        self.setGeometry(300,300,400,250)
        self.setWindowTitle('QSlider')
        self.show()

    def changeValue(self,value):
        if value == 0:
            self.label.setPixmap(QPixmap('mute.png'))
        elif value > 0 and value <= 30:
            self.label.setPixmap(QPixmap('min.png'))
        elif value > 30 and value < 80:
            self.label.setPixmap(QPixmap('med.png'))
        else:
            self.label.setPixmap(QPixmap('max.png'))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())

 

sld.valueChanged[int].connect(sel.Changevalu)
スライダーが動くとChangeValue()メソッドが呼び出され、スライダーの値に基づてラベルの画像を設定します。

4.QproguressBar
プログレスバーとは
時間がかかるタスクの進捗状況がどの程度完了したのかを視覚的、直感的に表示するものです。
QProgressBarWidgetsはPyQt5toolkitで水平または垂直のプログレスバーを提供します。プログレスバーの最小値と最大値を設定できます。デフォルト値は0~99です。

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

"""
This example shows a QProgressBar widget.
"""

from PyQt5.QtWidgets import (QWidget,QProgressBar,QPushButton,QApplication)
from PyQt5.QtCore import QBasicTimer
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #プログレスバーの作成
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30,40,200,25)

        #スタート(ストップ)ボタンの作成
        self.btn = QPushButton('Start',self)
        self.btn.move(40,80)
        self.btn.clicked.connect(self.doAction)

        self.timer = QBasicTimer()
        self.step = 0

        self.setGeometry(300,300,280,170)
        self.setWindowTitle('ProgressBar')
        self.show()

    #プログレスバーが100%以上になったらタイマーを止めてボタンラベルをFinishiedにする
    def timerEvent(self,e):
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('Finished')
            return
        
        #1%ずつ数字を増やしていく
        self.step = self.step + 1
        self.pbar.setValue(self.step)

    #ボタンがクリックされたときの動作
    def doAction(self):
        #タイマーが動いていたらタイマーを止め,ボタンラベルをStartにする
        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        #タイマーが動いていなければタイマーをスタートさせボタンラベルをStopにする    
        else:
            self.timer.start(100,self)
            self.btn.setText('Stop')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


self.timer = QBasicTimer()
プログレスバーをアクティブにするにはタイマーオブジェクト使用します。
タイマーイベントの起動にはstart()メソッドを呼び出します。
self.timer.start(100,self)
第1引数にタイムアウトの間隔をミリ秒単位で指定します。第2引数は
イベントを受け取るオブジェクトです。
starボタンを押すとプログレスバーが動き出します。100%になったら終わりです。stopボタンで一時停止、startボタンで再開はできますが100%からリセットすることができ来ません。

リセットボタンを作りたいのですが今回はここまでにしたいと思います。
次回はリセットボタンを作って少しバージョンアップさせたいと思います。

 

    上に戻る