Help us understand the problem. What is going on with this article?

【PythonでGUI】PyQt5 -ウィジェット-

More than 3 years have passed since last update.

前回の続き

Widgets
こちらのサイトを日本語でざっくりとまとめていきます。

【チェックボックス】

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


import sys
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):      

        # チャックボックス作成
        cb = QCheckBox('Show title', self)
        cb.move(20, 20)
        # チェックボックスにチェックを入れる
        cb.toggle()
        # チェックの状態によってタイトルを変える
        cb.stateChanged.connect(self.changeTitle)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('QCheckBox')
        self.show()


    def changeTitle(self, state):

        # チャックが入っているとき
        if state == Qt.Checked:
            self.setWindowTitle('QCheckBox')
        # チャックが入っていないとき
        else:
            # 何も引数を指定しないとタイトルがpythonになるみたい
            self.setWindowTitle('')


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

checkbox.png

【トグルボタン】

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


import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, 
    QFrame, QApplication)
from PyQt5.QtGui import QColor


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):      

        # 色の初期設定(黒にする)
        self.col = QColor(0, 0, 0)       

        # トグルボタンの作成
        redb = QPushButton('Red', self)
        redb.setCheckable(True)
        redb.move(10, 10)

        # クリックされたらsetColor関数の呼び出し
        redb.clicked[bool].connect(self.setColor)

        redb = QPushButton('Green', self)
        redb.setCheckable(True)
        redb.move(10, 60)

        redb.clicked[bool].connect(self.setColor)

        blueb = QPushButton('Blue', self)
        blueb.setCheckable(True)
        blueb.move(10, 110)

        blueb.clicked[bool].connect(self.setColor)

        self.square = QFrame(self)
        self.square.setGeometry(150, 20, 100, 100)
        self.square.setStyleSheet("QWidget { background-color: %s }" %  
            self.col.name())

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


    def setColor(self, pressed):

        # 押されたボタンをsource変数に代入
        source = self.sender()      

        # ボタンがクリックされたら、色を設定
        if pressed:
            val = 255
        else: val = 0

        # Redボタンが押されたら、色に赤を混ぜる
        if source.text() == "Red":
            self.col.setRed(val)    
        # Greenボタンが押されたら、色に緑を混ぜる            
        elif source.text() == "Green":
            self.col.setGreen(val)   
        # Blueボタンが押されたら、色に青を混ぜる
        else:
            self.col.setBlue(val) 

        # 色を変える
        self.square.setStyleSheet("QFrame { background-color: %s }" %
            self.col.name())  


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

初期状態
toggle_before.png

RedボタンとBlueボタンを押したとき
toggle_after.png

【スライダー】

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


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


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)
        # スライダーが動くとchangeValue関数が呼び出される
        sld.valueChanged[int].connect(self.changeValue)

        # ラベル作成
        self.label = QLabel(self)
        # ラベルに初期画像設定
        self.label.setPixmap(QPixmap('orange.png'))
        self.label.setGeometry(160, 40, 80, 30)

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


    def changeValue(self, value):

        # スライダーの位置によって画像を変化させる
        if value == 0:
            # オレンジ色の画像
            self.label.setPixmap(QPixmap('orange.png'))
        elif value > 0 and value <= 30:
            # 黄色の画像
            self.label.setPixmap(QPixmap('yellow.png'))
        elif value > 30 and value < 80:
            # 緑色の画像
            self.label.setPixmap(QPixmap('green.png'))
        else:
            # 青色の画像
            self.label.setPixmap(QPixmap('blue.png'))


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

orange_slider.pngyellow_slider.png
green_slider.pngblue_slider.png

【プログレスバー】

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


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


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('QProgressBar')
        self.show()


    # 時間のイベントハンドラ
    def timerEvent(self, e):

        # プログレスバーが100%以上になったらタイマーを止め、ボタンラベルをFinishedにする
        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):

        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            # startの第一引数はバーが進む速さを指定
            self.timer.start(100, self)
            self.btn.setText('Stop')


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

progress_1.png progress_2.png progress_3.png

【カレンダー】

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


import sys
from PyQt5.QtWidgets import (QWidget, QCalendarWidget, 
    QLabel, QApplication)
from PyQt5.QtCore import QDate


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):      

        # カレンダーウィジェットの作成
        cal = QCalendarWidget(self)
        cal.setGridVisible(True)
        cal.move(20, 20)
        # 日付がクリックされたらshowDate関数を呼び出す
        cal.clicked[QDate].connect(self.showDate)

        self.lbl = QLabel(self)
        # 本日の日付を代入
        date = cal.selectedDate()
        # 本日の日付をラベルテキストにする
        self.lbl.setText(date.toString())
        # ラベルテキストを見やすい位置に移動
        self.lbl.move(430, 320)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Calendar')
        self.show()


    def showDate(self, date):     

        # クリックされた日付をラベルテキストにセット
        self.lbl.setText(date.toString())


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

初期状態
calneder_1.png

6月15日を選択
calender_2.png

次回Widgets IIをざっくり試していきます。

Nobu12
ユニークで奇抜な面白いアイディアのプログラミングをしたい!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした