12
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PyQt5とPython3で遊んでみた

Last updated at Posted at 2016-12-20

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

12
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?