例を含む PyQt5 チュートリアル:Python で PyQt を使用して GUI を設計する
PyQt とは
PyQt クロスプラットフォーム アプリケーション開発フレームワークとしても機能する、オープン ソースのウィジェット ツールキット Qt の Python バインディングです。 Qt は、すべての主要なデスクトップ、モバイル、組み込みプラットフォーム用の GUI アプリケーションを作成するための一般的な C++ フレームワークです (Linux、Windows、MacOS、Android、iOS、Raspberry Pi などをサポートしています)。
この PyQt5 チュートリアルでは、次のことを学びます:
- PyQT の機能
- PyQt のバージョン
- PyQt5 のインストール方法
- 基本的な PyQt の概念とプログラム
- コンポーネントとウィジェット
- テーマ
PyQT の機能
PyQt の重要な機能は次のとおりです。
次のようなさまざまな機能をカバーする 600 以上のクラスで構成される PyQt について学びます
- グラフィカル ユーザー インターフェース
- SQL データベース
- ウェブ ツールキット
- XML 処理
- ネットワーキング
これらの機能を組み合わせて、高度な UI やスタンドアロン アプリケーションを作成できます。あらゆる業界の多くの大手企業が Qt を使用しています。例としては、LG、Mercedes、AMD、Panasonic、Harman などがあります。
PyQt のバージョン
PyQt には、PyQt4 と PyQt5 の 2 つのエディションがあります。 PyQt4 は Qt フレームワークの 4.x および 5.x バージョンをバインドするためのグルー コードを提供しますが、PyQt5 は 5.x バージョンのみのバインディングを提供します。その結果、PyQt5 は古いバージョンの非推奨モジュールと下位互換性がありません。この Qt GUI チュートリアルでは、例のデモンストレーションに PyQt5 を使用します。これら 2 つのバージョンとは別に、
Riverbank Computing は、Qt3D フレームワークの Python バインディングである PyQt3D も提供しています。 Qt3D は、2D/3D レンダリングによるリアルタイム シミュレーション システムの作成に使用されるアプリケーション フレームワークです。
PyQt5 のインストール方法
この PyQt5 チュートリアルでは、PyQt をインストールする 2 つの方法について説明します。
- Wheel ファイルの使用
- ソースからのビルドとインストール
Qt (キュートと発音) は複雑なシステムであり、PyQt コードベースには内部でコンパイルされた C++ および Python コードが含まれています。そのため、他の Python ライブラリと比較して、ソースからビルドしてインストールするプロセスは複雑です。ただし、ホイールを使用して PyQt5 を簡単にインストールできます。
車輪付きの設置
Wheels は、Python の新しい標準パッケージおよび配布形式です。簡単に言えば、ホイールは特別な名前と .whl を持つ ZIP アーカイブです。 ファイル拡張子。 Wheels は、Python の最近のバージョンにデフォルトで含まれている pip (Python のパッケージ マネージャー) を使用してインストールできます。
したがって、Python 3.4 以降がインストールされている場合は、既に pip があります。ただし、古いバージョンの Python を使用している場合は、先に進む前に pip をダウンロードしてインストールする必要があります。その手順については、https://pypi.org/project/pip/ のリンクで検索できます。
PyQt5 をインストールするには、
ステップ 1) コマンド プロンプトを開きます。
Windows マシンでコマンド プロンプトまたは PowerShell を開きます。
ステップ 2) 以下を入力してください。
pip install PyQt5
ステップ 3) インストールは成功しました。
この PyQt5 チュートリアルのこのステップでは、PyQt5 whl パッケージ (約 50 MB) をダウンロードし、システムにインストールします。
または、コンピューターにインストールされている Python のバージョンの Windows バイナリをダウンロードすることもできます。
完了したら、この PyQt5 チュートリアルの次のセクションに進み、最初の GUI アプリを作成します。
基本的な PyQt の概念とプログラム
PyQt5 をコンピューターに正常にインストールしたので、Python GUI 設計アプリケーションを作成する準備が整いました。
画面に空のウィンドウを表示するこの PyQt5 チュートリアルの簡単なアプリから始めましょう。
Python IDLE を起動して、次のように入力します。
プログラム 1
import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99") w.show() sys.exit(app.exec_())
それを app.py として保存し (名前は重要ではありません)、F5 を押してプログラムを実行します。または、保存したファイルをダブルクリックしてアプリケーションを起動します。すべてを正しく行うと、下に示すように、Guru99 というタイトルの新しいウィンドウが開きます。
すごい!それは働いています。それほど多くはありませんが、基本を理解するには十分です。この PyQt チュートリアルでは、プログラムの各行が何をするのかを詳しく見てみましょう。
from PyQt5.QtWidgets import QApplication, QWidget
このステートメントは、GUI を作成するために必要なすべてのモジュールを現在の名前空間にインポートします。 QtWidgets モジュールには、この Python Qt チュートリアルで使用する主要なウィジェットがすべて含まれています。
app = QApplication(sys.argv)
ここでは、QApplication クラスのオブジェクトを作成しています。このステップは PyQt5 に必要です。すべての UI アプリは、アプリへの一種のエントリ ポイントとして、QApplication のインスタンスを作成する必要があります。作成しないと、エラーが表示されます。
sys.argv は、シェルを介してアプリケーションを起動するとき、またはインターフェイスを自動化するときに、アプリケーションに渡すことができるコマンドライン パラメータのリストです。
この PyQt5 の例では、QApplications に引数を渡しませんでした。したがって、以下のコードに置き換えることもでき、sys モジュールをインポートする必要さえありません。
app = QApplication([])
w = QWidget()
次に、QWidget クラスのオブジェクトを作成します。 QWidget は Qt のすべての UI オブジェクトの基本クラスであり、アプリで表示される事実上すべてがウィジェットです。これには、ダイアログ、テキスト、ボタン、バーなどが含まれます。複雑なユーザー インターフェイスの設計を可能にする機能は、ウィジェットをネストできることです。つまり、別のウィジェット内にあるウィジェット内にウィジェットを含めることができます。次のセクションでこれを実際に見ていきます。
w.resize(300,300)
QWidget クラスの resize メソッドを使用すると、任意のウィジェットのサイズを設定できます。この場合、ウィンドウのサイズを 300px x 300px に変更しました。
ここで、ウィジェットを一緒にネストできることを覚えておく必要があります。最も外側のウィジェット (つまり、親のないウィジェット) はウィンドウと呼ばれます。
w.setWindowTitle("Guru99")
setWindowTitle() メソッドを使用すると、渡した文字列にウィンドウのタイトルを設定する文字列を引数として渡すことができます。 PyQt5 の例では、タイトル バーに Guru99 が表示されます。
w.show()
show() は、ウィジェットをモニター画面に表示するだけです。
sys.exit(app.exec_())
app.exec_() メソッドは、Qt/C++ イベント ループを開始します。ご存じのとおり、PyQt は大部分が C++ で記述されており、イベント ループ メカニズムを使用して並列実行を実装しています。 app.exec_() は制御を Qt に渡します。Qt は、ユーザーが GUI からアプリケーションを閉じたときにのみアプリケーションを終了します。そのため、他の python プログラムのように ctrl+c でアプリケーションを終了できません。 Qt はアプリを制御するため、Python イベントはアプリケーション内で設定しない限り処理されません。また、exec メソッドの名前にはアンダースコアが含まれていることに注意してください。これは、exec() が既に Python のキーワードであり、アンダースコアが名前の競合を解決するためです。
空の窓の向こう
前のセクションでは、Qt で基本的なウィジェットを作成する方法を見てきました。今度は、ユーザーが真に対話できる、より複雑なインターフェースを作成するときです。再び IDLE を起動し、次のように記述します。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox def dialog(): mbox = QMessageBox() mbox.setText("Your allegiance has been noted") mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru") mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) mbox.exec_() if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99") label = QLabel(w) label.setText("Behold the Guru, Guru99") label.move(100,130) label.show() btn = QPushButton(w) btn.setText('Beheld') btn.move(110,150) btn.show() btn.clicked.connect(dialog) w.show() sys.exit(app.exec_())
ファイルを appone.py または任意の名前で保存し、F5 キーを押してプログラムを実行します。間違いがなければ、IDLE は以下に示すようにテキストとボタンのある新しいウィンドウを開きます。
<オール>
ご覧のとおり、メッセージ ボックスにウィンドウ タイトルを設定していないため、Python 自体によってデフォルトのタイトルが提供されています。
動作するようになったので、前の PyQt5 の例に追加したコードを見てみましょう。
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
これにより、PyQt5 の例で使用したウィジェット (QLabel、QPushButton、QMessageBox) がさらにインポートされます。
def dialog(): mbox = QMessageBox() mbox.setText("Your allegiance has been noted") mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru") mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) mbox.exec_()
ここでは、メッセージ ボックス ウィジェットを作成し、ボタンやその他のフィールドにテキストを設定する dialog という名前のメソッドを定義しました。
dialog メソッドは、特定のウィジェット (この場合は btn PushButton) でボタンが押されたときに、プログラムのメイン ブロックから呼び出されます。そのボタンでトリガーされたクリック イベントにより、この関数が実行されます。このような機能は Qt ではスロットと呼ばれ、シグナルについて詳しく学びます。 とスロット
if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99")
これはアプリのメイン セクションであり、前の例と同様に、QApplication のインスタンスを作成することから始め、その後に単純なウィジェット (QWidget のインスタンス) を作成します。
label = QLabel(w) btn = QPushButton(w)
このアプリケーションに QLabel と QPushButton の 2 つの新しいウィジェットを追加しました。 QLabel はウィジェット内の編集不可能なテキストまたはプレースホルダーを印刷するために使用されますが、QPushButton はクリック可能なボタンを作成するために使用されます。
ここで重要なことは、label オブジェクトと btn オブジェクトを作成するときに、window オブジェクト (w) を QLabel と QPushButton のコンストラクターに渡すことです。これは、PyQt5 でネストがどのように機能するかです。別のウィジェット内にウィジェットを作成するには、親ウィジェットの参照を子のコンストラクターに渡します。
label.move(100,130) btn.move(110,150)
move() は、親ウィジェットに対するウィジェットの位置を設定するために使用されます。最初のケースでは、ラベルはウィンドウの左から 100 ピクセル、上から 130 ピクセル移動します。
同様に、ボタンはウィンドウの左から 110 ピクセル、上から 150 ピクセルに配置されます。この例は、レイアウトを実現するための大雑把な方法であり、通常は本番環境では使用されません。ここには学習目的でのみ含まれています。 Qt は、この PyQt チュートリアルの今後のセクションで詳しく説明するさまざまなレイアウトをサポートしています。
btn.clicked.connect(dialog)
最後に、これは Qt のシグナルとスロットの例です。 GUI ベースのアプリケーションでは、要素にカーソルを合わせる、ボタンをクリックするなど、ユーザーが実行するアクションに基づいて関数が実行されます。これらのアクションはイベントと呼ばれます . app.exec_() メソッドが制御を Qt event- に転送することを思い出してください。 ループ。これがイベント ループの目的です。イベントをリッスンし、それに応じてアクションを実行します。
ユーザーがボタンをクリックするなど、イベントが発生するたびに、対応する Qt ウィジェットが シグナル を発生させます .これらのシグナルは、シグナルがトリガーされたときに関数が実行されるように、Python 関数 (この例のダイアログ関数など) に接続できます。これらの機能はスロットと呼ばれます
続いて、イベントからのシグナルに応答してスロット関数をトリガーする基本的な構文は次のとおりです。
widget.signal.connect(slot)
つまり、シグナル ウィジェットによってトリガーされます 、接続されたスロット 関数が実行されます。要約すると、シグナルとスロットは Qt によってオブジェクト間の通信に使用され、コンポーネントの再利用性と対話性が促進されます。
ウィジェットをネストし、シグナルとスロットを使用してインタラクションを実装する方法がわかったので、PyQt アプリで使用できる便利なウィジェットとその他のクラスのリストを次に示します。
コンポーネントとウィジェット
PyQt には、GUI アプリを作成するための多数のウィジェットが用意されています。ただし、PyQt5 では、ライセンスの異なるモジュールとリビジョンにクラスが再編成されています。
したがって、PyQt5 の構造の概要を把握することが重要です。このセクションでは、PyQt5 が内部的にどのように構成されているかを確認し、PyQt5 が提供するさまざまなモジュール、ライブラリ、および API クラスについて学びます。
PyQt5 ディレクトリ構造
これらは、Python の Qt バインディング、特に PyQt5 で使用される基本的なモジュールです。
- Qt :以下で説明するすべてのクラス/モジュールを 1 つのモジュールに結合します。アプリケーションが使用するメモリが大幅に増加します。ただし、1 つのモジュールをインポートするだけでフレームワークを管理する方が簡単です。
- QtCore :他のモジュールで使用されるコアの非グラフィカル クラスが含まれます。これは、Qt イベント ループ、シグナル、スロット接続などを実装する場所です。
- QtWidgets :Pyqt5 で利用可能なほとんどのウィジェットが含まれています。
- QtGui :GUI コンポーネントを含み、QtCore モジュールを拡張します。
- QtNetwork :Qt を介してネットワーク プログラミングを実装するために使用されるクラスが含まれています。 TCP サーバー、TCP ソケット、UDP ソケット、SSL 処理、ネットワーク セッション、DNS ルックアップをサポートしています。
- QtMultimedia 低レベルのマルチメディア機能を提供します。
- QtSql :SQL データベースのデータベース統合を実装します。 ODBC、MySQL、Oracle、SQLite、および PostgreSQL をサポートします。
PyQt5 ウィジェット
これは、PyQt5 で最も頻繁に使用されるウィジェットのリストです
- QLineEdit :これは、ユーザーが 1 行のテキストを入力できる入力フィールドです。
line = QLineEdit()
- QRadioButton :これは、html のラジオ ボタンに似た、選択可能なボタンを持つ入力フィールドです。
rad = QRadioButton("button title") rad.setChecked(True) #to select the button by default.
- QComboBox :選択可能な項目のリストを含むドロップダウン メニューを表示するために使用されます。
drop = QComboBox(w) drop.addItems(["item one", "item two", "item three"])
- QCheckBox :ラベルの前に選択可能な四角いボックスを表示します。ラジオ ボタンと同様に、選択するとチェックが入ります。
check = QCheckBox("button title")
- QMenuBar :ウィンドウの上部に水平メニュー バーを表示します。このバーには、QMenu クラスのオブジェクトのみを追加できます。これらの QMenu オブジェクトには、さらに文字列、QAction オブジェクト、またはその他の QMenu オブジェクトを含めることができます。
- QToolBar :ウィンドウ内で移動できる水平バーまたはペインです。ボタンやその他のウィジェットが含まれる場合があります。
- QTab :ウィンドウのコンテンツを、ウィジェットの上部にあるさまざまなタブからアクセスできる複数のページに分割するために使用されます。タブバーとタブページの 2 つのセクションで構成されています。
- QScrollBar :ユーザーがウィンドウ内で上下にスクロールできるようにするスクロール バーを作成するために使用されます。これは、可動スライダー、スライダー トラック、およびスライダーを上下にスクロールする 2 つのボタンで構成されています。
scroll = QScrollBar()
- QSplitter :スプリッターは、ウィジェットが適切にグループ化され、乱雑に表示されないように、ウィンドウのコンテンツを分離するために使用されます。 QSplitter は、PyQt5 で利用可能な主要なレイアウト ハンドラーの 1 つであり、水平方向と垂直方向の両方でコンテンツを分割するために使用されます。
- QDock :ドック ウィジェットは、2 つのプロパティを持つサブウィンドウです:
- メイン ウィンドウ内で移動でき、
- 親ウィンドウの外で画面上の別の場所にドッキングできます。
レイアウトとテーマ
前の PyQt5 の例では、GUI でウィジェットの位置を設定するために move() および resize() メソッドのみを使用していました。
ただし、PyQt には堅牢なレイアウト管理エンジンがあり、アプリケーションの高度なユーザー インターフェイスを作成するために使用できます。このセクションでは、Qt でレイアウトの作成と管理に使用される 2 つの重要なクラスについて学習します。
<オール>QBoxLayout
QBoxLayout は、レイアウトの子ウィジェットを水平または垂直の行に配置するために使用されます。 QBoxLayout から継承する対象となる 2 つのクラスは次のとおりです。
- QHBoxLayout:子ウィジェットを水平に並べるために使用されます。
- QVBoxLayout:子ウィジェットを垂直に並べるために使用されます。
たとえば、QHBoxLayout に合わせて配置された 3 つのボタンは次のようになります。
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() w.setWindowTitle("Musketeers") btn1 = QPushButton("Athos") btn2 = QPushButton("Porthos") btn3 = QPushButton("Aramis") hbox = QHBoxLayout(w) hbox.addWidget(btn1) hbox.addWidget(btn2) hbox.addWidget(btn3) w.show() sys.exit(app.exec_())
これが QVBoxLayout での外観です。
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() w.setWindowTitle("Musketeers") btn1 = QPushButton("Athos") btn2 = QPushButton("Porthos") btn3 = QPushButton("Aramis") vb = QVBoxLayout(w) vb.addWidget(btn1) vb.addWidget(btn2) vb.addWidget(btn3) w.show() sys.exit(app.exec_())
この時点で説明が必要な唯一の関数は addWidget() メソッドです。ウィジェットを HBox または VBox レイアウトに挿入するために使用されます。次のセクションで説明するように、異なる数のパラメーターを取る他のレイアウトでも使用されます。ウィジェットは、挿入した順序でレイアウト内に表示されます。
QGridLayout
QGridLayout は、ウィジェットがグリッド (マトリックスや 2D 配列など) の形式で配置されるインターフェイスを作成するために使用されます。グリッド レイアウトに要素を挿入するには、マトリックス表現を使用して、グリッド内の行数と列数、およびそれらの要素の位置を定義できます。
たとえば、3*3 グリッド (つまり、3 行 3 列のグリッド) を作成するには、次のコードを記述します:
Import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() grid = QGridLayout(w) for i in range(3): for j in range(3): grid.addWidget(QPushButton("Button"),i,j) w.show() sys.exit(app.exec_())
これが出力になります:
グリッド レイアウトの addWidget() メソッドは次の引数を取ります:
- グリッドに追加するウィジェット オブジェクト
- オブジェクトの x 座標
- オブジェクトの y 座標
- 行スパン (デフォルト =0)
- 列範囲 (デフォルト =0)
理解を深めるために、以下に示すように各ウィジェットを手動で挿入できます
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() grid = QGridLayout(w) grid.addWidget(QPushButton("Button one"),0,0) grid.addWidget(QPushButton("Button two"),0,1) grid.addWidget(QPushButton("Button three"),1,0) grid.addWidget(QPushButton("Button four"),1,1) w.show() sys.exit(app.exec_())
グリッドは次のようになります:
複数の行または列にまたがるために、rowspan および colspan パラメータを addWidget() に渡すこともできます。
たとえば、
grid.addWidget(QPushButton("Button five"),2,0,1,0)
これにより、両方の列にまたがるボタンが作成されます。
テーマ
PyQt5 には、アプリで使用できるいくつかの組み込みテーマが付属しています。 setStyle() QApplication インスタンスで呼び出されるメソッドは、アプリケーションに特定のテーマを設定するために使用されます。
たとえば、次のコード行を追加すると、アプリケーションのテーマがデフォルトから Fusion に変更されます
app.setStyle("Fusion")
これは、前の例が Fusion テーマでどのように見えるかです
アプリのテーマを設定するためのもう 1 つの便利な関数は、setPalette() メソッドです。 setPalette() を使用してさまざまなウィジェットの色を変更するコードを次に示します。
import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * from PyQt5.QtGui import QPalette if __name__ == "__main__": app = QApplication([]) app.setStyle("Fusion") qp = QPalette() qp.setColor(QPalette.ButtonText, Qt.black) qp.setColor(QPalette.Window, Qt.black) qp.setColor(QPalette.Button, Qt.gray) app.setPalette(qp) w = QWidget() grid = QGridLayout(w) grid.addWidget(QPushButton("Button one"),0,0) grid.addWidget(QPushButton("Button two"),0,1) grid.addWidget(QPushButton("Button three"),1,0) grid.addWidget(QPushButton("Button four"),1,1) w.show() sys.exit(app.exec_())
これが結果です。
setPalette() メソッドを使用するには、まずパレットを定義する必要があります。これは、QPalette クラスのオブジェクトを作成することによって行われます。
qp = QPalette()
QPalette クラスは QtGui モジュールに属しており、これを機能させるにはインポートする必要があることに注意してください。 QPalette オブジェクトを作成したら、setColor() メソッドを使用して、色を変更したいウィジェットの名前と設定したい色を渡します。
qp.setColor(QPalette.Window, Qt.black)
これにより、ウィンドウの色が黒に変わります。配色を定義したら、setPalette() 関数を使用してパレットをアプリケーションに適用します。
app.setPalette(qp)
アプリの基本的なテーマを作成する場合は、これで十分です。 PyQt では、スタイルシートを使用してウィジェットの外観を定義することもできます。 CSS に精通している場合は、Qt スタイル シートを使用してアプリの高度なスタイルを簡単に定義できます。
まとめ
- PyQt は、C++ UI フレームワーク Qt の Python バインディングです。
- PyQt4 と PyQt5 は、Riverbank Computing によって開発された 2 つのメジャー バージョンです。
- PyQt フレームワークの主なモジュールは次のとおりです: <オール>
- Qt
- QtCore
- QtWidget
- QtGui
- QtSql
- Qtネットワーク
- PyQt は次のようなさまざまなウィジェットをサポートしています: <オール>
- ボタン
- テキスト ラベル
- テキスト フィールド
- ラジオ ボタンとチェックボックス
- ツールバーとメニュー バー
- ウェブキット
- タブ
- ドック
- PyQt では、インタラクティブ性は シグナル を使用して実装されます とスロット。
- イベント ユーザーが GUI で実行するアクション (ボタンのクリックなど)。
- 合図 イベントが発生したときに、対応するウィジェットによって呼び出されます。
- スロット シグナルに接続され、シグナルが発生したときに実行される関数です。
- PyQt には堅牢なレイアウト エンジンがあり、高度なレイアウト設計と管理をサポートしています。これらは、PyQt でよく使用される 2 つのレイアウト スキームです。 <オール>
- ボックス レイアウト
- グリッド レイアウト
- PyQt デザイナーを使用すると、GUI アプリケーション用のカスタム テーマを作成でき、スタイル シートのサポートが組み込まれています。
- Qt Creator Python を使用して、ユーザー インターフェースやスタンドアロン アプリケーションを作成できます
Python