Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
20
Help us understand the problem. What is going on with this article?
@donkonishi

PyQt5とPython3で遊んでみた

More than 3 years have passed since last update.

Qtとは?

Qt(キュート)はC++言語で書かれたアプリケーション・ユーザインタフェース (UI) フレームワークである。

GUIツールキットとして広く知られているQtであるが、コンソールツールやサーバのような非GUIプログラムでも広く使用されている。
Wikipediaより

GUIアプリケーションを簡単に作ることができるフレームワーク。クロスプラットフォーム開発にも対応してるそう。

PyQtとは?

PyQtは、クロスプラットフォームなGUIツールキットであるQtのPythonバインディングにして、PythonでGUIプログラミングをするときの選択肢の一つである。
Wikipediaより

Python用にセッティングされたQt、GUIアプリケーションを簡単に作ることができる。

PyQtの利点

  • 機能が豊富で、感覚的にGUIのアプリケーションを作ることができる。
  • QtがPythonだけでなく、いろんな言語に対応してる、そのため他言語への移植が容易

PyQtの問題点

  • よくわからないけど、商用利用する場合にはライセンスが必要(とても高い)
  • リファレンスが読みにくい(おそらく、いや間違いなく僕の読解力不足、英語力不足)

先ずはPyQt5を使える環境を整える

手順

  1. Pythonをインストール
  2. Qtのインストール(かなり時間かかるかも)
  3. PyQtのインストール

環境設定についてはここでは解説しないので、ggrks

実際にコードを書いてみよう

先ずはWindowを出してみる

window.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

実行すると何もないウィンドウが出る

ボタンとタイトルをつけてみよう

button.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        button = QPushButton('button')

        layout = QGridLayout()
        layout.addWidget(button)
        self.setLayout(layout)
        self.setWindowTitle("Button")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

ボタンとタイトルが付いた

テキストフィールドの値を読み込んで表示してみよう

input-output.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.button = QPushButton('読み込み・表示')
        self.button.clicked.connect(self.output)
        self.inputText = QLineEdit()
        self.inputText.setText("")

        self.outputText = QLineEdit()
        self.outputText.setText("")
        self.outputText.setReadOnly(True)

        textLayout = QHBoxLayout()
        textLayout.addWidget(self.inputText)
        textLayout.addWidget(self.outputText)

        layout = QVBoxLayout()
        layout.addLayout(textLayout)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.setWindowTitle("Button")

    def output(self):
        self.outputText.setText(self.inputText.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

テキストを入力してボタンを押すと、テキストが出力される

QGraphicsViewで入力された文字列を表示

string-graphic.py
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class ShowString(QGraphicsItem):
    def __init__(self, width=200, height=10, text=""):
        super(ShowString, self).__init__()
        self.width = width
        self.height = height
        self.text = text

    def paint(self, painter, option, widget):
        painter.setPen(Qt.black)
        painter.drawText(0, 20, self.text)

    def boundingRect(self):
        return QRectF(0,0,400,100)

    def setText(self, text):
        self.text = text
        self.update()

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.graphicView = QGraphicsView()
        self.showString = ShowString()
        scene = QGraphicsScene(self.graphicView)
        scene.setSceneRect(0, 0, 400, 100)
        self.graphicView.setScene(scene)
        self.graphicView.resize(300,50)
        scene.addItem(self.showString)

        self.button = QPushButton('読み込み・表示')
        self.button.clicked.connect(self.output)
        self.inputText = QLineEdit()
        self.inputText.setText("")

        self.outputText = QLineEdit()
        self.outputText.setText("")
        self.outputText.setReadOnly(True)

        textLayout = QHBoxLayout()
        textLayout.addWidget(self.inputText)
        textLayout.addWidget(self.outputText)

        layout = QVBoxLayout()
        layout.addWidget(self.graphicView)
        layout.addLayout(textLayout)
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.setWindowTitle("Button")

    def output(self):
        self.outputText.setText(self.inputText.text())
        self.showString.setText(self.inputText.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

一個前のプログラムに、QGraphicsViewでの文字列出力を追加した

またサンプルプログラム追加するかも。。。

続き:PyQt5とPythonでサブウィンドウを出してみる

感想・考察

以上、PyQt5とPython3で遊んでみた、でした。
本当に感覚的にGUI設計ができるので、好き。

参考

以下、参考にさせてもらいました。ありがとうございました。
http://d.hatena.ne.jp/mFumi/20141112/1415806010
http://qiita.com/kenasman/items/55505654823e9d040e6e

20
Help us understand the problem. What is going on with this article?
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
donkonishi
(つ∀-)オヤスミー

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
20
Help us understand the problem. What is going on with this article?