PyQt5チュートリアル(サンプル付き):作成 Python Qtを使用したGUI
⚡ スマートサマリー
PyQtは Python クロスプラットフォームのQtウィジェットツールキットのバインディングで、開発者がネイティブデスクトップGUIを構築できるようにします。600以上のウィジェットをラップしています。 C++ ウィンドウ、ボタン、レイアウト、シグナル、スロット、テーマを網羅するクラス Windows, macOS、およびLinux。
以下のセクションでは、PyQtの基本からインストール、コアウィジェット、レイアウト、テーマまで、実行可能なサンプルを交えながら解説します。
PyQtとは何ですか?
PyQt Python オープンソースのウィジェットツールキットであるQtのバインディング。Qtはクロスプラットフォームアプリケーション開発フレームワークとしても機能します。Qtは人気のある C++ すべての主要なデスクトップ、モバイル、組み込みプラットフォーム向けの GUI アプリケーションを作成するためのフレームワーク (Linux、 Windows, macOS, Android、iOS、Raspberry Piなど)。
PyQtは、イギリスに拠点を置くRiverbank Computing社によって開発・保守されているフリーソフトウェアである一方、QtはフィンランドのThe Qt Companyという企業によって開発されている。
PyQtの機能
PyQt の重要な機能は次のとおりです。
PyQtは、以下のようなさまざまな機能を網羅する600以上のクラスで構成されています。
- グラフィカルユーザーインターフェイス
- SQLデータベース
- ウェブツールキット
- XML処理
- Networking
これらの機能を組み合わせることで、高度なユーザーインターフェースやスタンドアロンアプリケーションを作成できます。あらゆる業界の多くの大手企業がQtを使用しています。例えば、LG、メルセデス、AMD、パナソニック、ハーマンなどが挙げられます。
PyQt のバージョン
PyQt には PyQt4 と PyQt5 の 2 つのエディションがあります。PyQt4 は Qt フレームワークの 4.x および 5.x バージョンをバインドするためのグルー コードを提供しますが、PyQt5 は 5.x バージョンのみをバインドします。そのため、PyQt5 は古いバージョンの非推奨モジュールとの下位互換性がありません。この PyQt GUI チュートリアルでは、例のデモンストレーションに PyQt5 を使用します。Riverbank Computing は、これら 2 つのバージョンに加えて、PyQt3D も提供しています。 Python Qt3Dフレームワーク用のバインディング。Qt3Dは、2D/3Dレンダリングを備えたリアルタイムシミュレーションシステムを作成するために使用されるアプリケーションフレームワークです。
PyQt5のインストール方法
この PyQt5 チュートリアルでは、PyQt をインストールする XNUMX つの方法について説明します。
- Wheel ファイルの使用
- ソースからのビルドとインストール
Qt(キュートと発音)は複雑なシステムであり、PyQtのコードベースにはコンパイルされた C++ (NAIST) と Python 内部コードが複雑です。そのため、他のソフトウェアと比べて、ソースコードからビルドしてインストールするプロセスが複雑です。 Python ライブラリ。ただし、wheelファイルを使えばPyQt5を簡単にインストールできます。
車輪付きの設置
ホイールは新しい標準です Python パッケージングおよび配布形式。簡単に言えば、ホイールは特別な名前と .うーん ファイル拡張子。ホイールはpip(Pythonのパッケージマネージャ)は、最近のバージョンの Python.
だから、あなたが持っているなら Python 3.4以降がインストールされている場合は、すでにpipがインストールされています。ただし、古いバージョンを使用している場合は、 Python先に進む前に、pipをダウンロードしてインストールする必要があります。手順については、こちらのリンクを参照してください。 https://pypi.org/project/pip/.
PyQt5をインストールするには:
ステップ1) コマンドプロンプトを開きます。
コマンド プロンプトまたは PowerShell を開きます。 Windows 機械。
ステップ2) 以下を入力してください。
pip install PyQt5
ステップ3) インストールに成功。
この PyQt5 チュートリアルのこのステップでは、PyQt5 whl パッケージ (約 50 MB) をダウンロードし、システムにインストールします。
あるいは、 Windows バージョンのバイナリ Python あなたのコンピュータにインストールされます。
完了したら、この PyQt5 チュートリアルの次のセクションに進み、最初の GUI アプリを作成します。
基本的な PyQt Concepts とプログラム
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 キーを押してプログラムを実行します。または、保存したファイルをダブルクリックしてアプリケーションを起動することもできます。すべて正しく操作していれば、タイトルが表示された新しいウィンドウが開きます。 Guru下記に示すように99。
素晴らしい!うまくいきました。大したことではありませんが、基本を理解するには十分です。それでは、このPyQtチュートリアルで、プログラムの各行が何をしているのかを詳しく見ていきましょう。
from PyQt5.QtWidgets import QApplication, QWidget
このステートメントは、GUIを作成するために必要なすべてのモジュールを現在の名前空間にインポートします。QtWidgetsモジュールには、このチュートリアルで使用するすべての主要なウィジェットが含まれています。 Python Qt チュートリアル。
app = QApplication(sys.argv)
ここでは、QApplication クラスのオブジェクトを作成しています。 このステップは PyQt5 では必須です。 すべての UI アプリは、アプリへの一種のエントリ ポイントとして、QApplication のインスタンスを作成する必要があります。 作成しないとエラーが表示されます。
sys.argv は、シェル経由でアプリケーションを起動するとき、またはインターフェイスを自動化するときにアプリケーションに渡すことができるコマンドライン パラメーターのリストです。
このPyQt5の例では、QApplicationに引数を渡していません。そのため、以下のコードに置き換えても、sysモジュールをインポートする必要はありません。
app = QApplication([])
w = QWidget()
次に、QWidget クラスのオブジェクトを作成します。QWidget は Qt のすべての UI オブジェクトの基本クラスであり、アプリに表示されるほぼすべてのものがウィジェットです。これには、ダイアログ、テキスト、ボタン、バーなどが含まれます。複雑なユーザー インターフェイスを設計できる機能は、ウィジェットをネストできることです。つまり、ウィジェットの中にウィジェットを配置し、そのウィジェットの中にさらに別のウィジェットを配置することができます。次のセクションでは、この動作を確認します。
w.resize(300,300)
QWidget クラスのsizeメソッドを使用すると、任意のウィジェットの寸法を設定できます。 この場合、ウィンドウのサイズを 300 ピクセル x 300 ピクセルに変更しました。
ここで覚えておくべきことは、ウィジェットは入れ子にできるということです。最も外側のウィジェット(つまり、親を持たないウィジェット)はウィンドウと呼ばれます。
w.setWindowTitle("Guru99")
setWindowTitle() メソッドでは、引数として文字列を渡すことで、ウィンドウのタイトルをその文字列に設定できます。PyQt5 の例では、タイトルバーには次のように表示されます。 Guru99.
w.show()
show() は単にウィジェットをモニター画面に表示するだけです。
sys.exit(app.exec_())
app.exec_() メソッドは Qt/ を起動しますC++ イベントループ。ご存知のとおり、PyQtは主に C++ そして、イベントループ機構を使用して並列実行を実装します。app.exec_() は制御を Qt に渡しますが、Qt はユーザーが GUI からアプリケーションを閉じた場合にのみアプリケーションを終了します。そのため、他のアプリケーションのように Ctrl+C を押してもアプリケーションは終了しません。 Python プログラム。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、QMessage) がインポートされます。Box.
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 というメソッドを定義しました。
特定のウィジェット (この場合はボタン PushButton) でボタンが押されると、ダイアログ メソッドがプログラムのメイン ブロックから呼び出されます。 そのボタンでトリガーされたクリック イベントにより、この関数が実行されます。 このような関数は Qt ではスロットと呼ばれます。詳しくは、 信号 (NAIST) と スロット 次の段落で説明します。
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 という XNUMX つの新しいウィジェットが追加されました。 QLabel はウィジェット内の編集不可能なテキストまたはプレースホルダーを印刷するために使用され、QPushButton はクリック可能なボタンを作成するために使用されます。
ここで注意すべき重要な点は、label オブジェクトと btn オブジェクトを作成するときに、ウィンドウ オブジェクト (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 に転送することを思い出してください。 イベント ループ。 イベント ループは、イベントをリッスンし、それに応じてアクションを実行するために存在します。
ユーザーがボタンをクリックするなどのイベントが発生すると、対応する Qt ウィジェットが 信号。 これらの信号を接続できるのは、 Python 機能 (この例のダイアログ関数のように) 信号がトリガーされたときに関数が実行されるようにします。 これらの関数は呼び出されます スロット Qt 言語で。
続いて、イベントからの信号に応じてスロット関数をトリガーするための基本的な構文は次のとおりです。
widget.signal.connect(slot)
これは、 信号 によってトリガーされます ウィジェット、接続された スロット 関数が実行されます。 要約すると、シグナルとスロットは、オブジェクト間で通信し、コンポーネントの再利用性と対話性を促進するために Qt によって使用されます。
ウィジェットをネストし、シグナルとスロットを使用してインタラクションを実装する方法がわかったので、ここでは、PyQt アプリで使用できる便利なウィジェットとその他のクラスのリストを示します。
コンポーネントとウィジェット
PyQt には、GUI アプリの作成に使用できるウィジェットが多数あります。 ただし、PyQt5 では、クラスがさまざまなモジュールに再編成され、ライセンスが改訂されました。
したがって、PyQt5の構造を俯瞰的に理解しておくことが非常に重要です。このセクションでは、PyQt5の内部構造と、PyQt5が提供するさまざまなモジュール、ライブラリ、APIクラスについて解説します。
PyQt5 ディレクトリ構造
これらは、 Pythonの Qt バインディング、具体的には PyQt5 です。
- Qt: これは、以下に挙げるすべてのクラス/モジュールを単一のモジュールに統合します。アプリケーションが使用するメモリ量は大幅に増加しますが、モジュールを1つだけインポートすることでフレームワークの管理が容易になります。
- Qtコア: 他のモジュールで使用されるコアの非グラフィカル クラスが含まれます。 ここに、Qt イベント ループ、シグナル、スロット接続などが実装されます。
- QtウィジェットPyQt5で利用可能なウィジェットのほとんどが含まれています。
- QtGui: GUI コンポーネントが含まれており、QtCore モジュールを拡張します。
- Qtネットワーク: Qt を介してネットワーク プログラミングを実装するために使用されるクラスが含まれています。 TCP サーバー、TCP ソケット、UDP ソケット、SSL 処理、ネットワーク セッション、および DNS ルックアップをサポートします。
- Qtマルチメディア低レベルのマルチメディア機能を提供します。
- QtSQL: SQL データベースのデータベース統合を実装します。 ODBCをサポート、 MySQL, Oracle, SQLite, PostgreSQL.
PyQt5 ウィジェット
以下は、PyQt5で最もよく使用されるウィジェットの一覧です。
- QLine編集: これは、ユーザーが XNUMX 行のテキストを入力できる入力フィールドです。
line = QLineEdit()
- Qラジオボタンこれは、HTMLのラジオボタンと同様に、選択可能なボタンを備えた入力フィールドです。
rad = QRadioButton("button title") rad.setChecked(True) #to select the button by default.
- QコンボBox: 選択可能な項目のリストを含むドロップダウン メニューを表示するために使用されます。
drop = QComboBox(w) drop.addItems(["item one", "item two", "item three"])
- QチェックBox: ラジオ ボタンと同様に、ラベルの前に選択可能な四角いボックスが表示され、選択するとチェックマークが付きます。
check = QCheckBox("button title")
- Qメニューバーウィンドウ上部に水平方向のメニューバーを表示します。このバーには、QMenu クラスのオブジェクトのみを追加できます。これらの QMenu オブジェクトには、文字列、QAction オブジェクト、または他の QMenu オブジェクトを含めることができます。
- Qツールバー: ウィンドウ内で移動できる水平バーまたはペインです。 ボタンやその他のウィジェットが含まれる場合があります。
- Qタブウィンドウの内容を複数のページに分割し、ウィジェット上部のタブからアクセスできるようにするために使用されます。タブバーとタブページの2つのセクションで構成されています。
- Qスクロールバー: これは、ユーザーがウィンドウ内で上下にスクロールできるようにするスクロールバーを作成するために使用されます。可動スライダー、スライダーで構成されています。 trackボタンと、スライダーを上下にスクロールするための2つのボタンがあります。
scroll = QScrollBar()
- Qスプリッター: スプリッターは、ウィジェットが適切にグループ化され、乱雑に表示されないように、ウィンドウのコンテンツを分離するために使用されます。 QSplitter は、PyQt5 で使用できる主要なレイアウト ハンドラーの XNUMX つで、コンテンツを水平方向と垂直方向の両方に分割するために使用されます。
- Qドックドックウィジェットは、2つの特性を持つサブウィンドウです。メインウィンドウ内で移動できるだけでなく、親ウィンドウの外側の画面上の別の場所にドッキングすることもできます。
レイアウトとテーマ
前の PyQt5 の例では、GUI 内のウィジェットの位置を設定するために move() メソッドとsize() メソッドのみを使用していました。
ただし、PyQt には、アプリケーションの高度なユーザー インターフェイスの作成に使用できる堅牢なレイアウト管理エンジンがあります。 このセクションでは、Qt でレイアウトの作成と管理に使用される XNUMX つの重要なクラスについて学びます。
- QBoxレイアウト
- QGridLayout
QBoxレイアウト
QBoxレイアウトは、レイアウトの子ウィジェットを水平または垂直の行に配置するために使用されます。 Q から継承する XNUMX つの対象クラスBoxレイアウトは次のとおりです。
- QHBoxレイアウト: 子ウィジェットを水平に並べるために使用されます。
- QVBoxレイアウト: 子ウィジェットを垂直に並べるために使用されます。
たとえば、QH に XNUMX つのボタンを並べると、次のようになります。Boxレイアウトが見えてきます。
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_())
QV ではこのように表示されますBoxレイアウト。
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() メソッドです。 H にウィジェットを挿入するために使用されます。Box またはVBox レイアウト。 次のセクションで説明するように、異なる数のパラメータを取る他のレイアウトでも使用されます。 ウィジェットは、挿入した順序でレイアウト内に表示されます。
QGridLayout
QGridLayout は、ウィジェットがグリッド (行列や 2D 配列など) の形式でレイアウトされるインターフェイスを作成するために使用されます。 グリッド レイアウトに要素を挿入するには、行列表現を使用して、グリッド内の行と列の数、およびそれらの要素の位置を定義できます。
たとえば、3*3 グリッド (つまり、XNUMX 行 XNUMX 列のグリッド) を作成するには、次のコードを記述します。
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)
- col-span(デフォルト値 = 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テーマで表示すると、次のようになります。
アプリのテーマ設定に役立つもう一つの便利な機能は、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モジュールに属しているため、この機能を使用するにはQtGuiモジュールをインポートする必要があります。QPaletteオブジェクトを作成したら、setColor()メソッドを使用して、色を変更したいウィジェットの名前と設定したい色を渡します。
qp.setColor(QPalette.Window, Qt.black)
これにより、ウィンドウの色が黒に変わります。カラースキームを定義したら、setPalette() 関数を使用して、そのパレットをアプリケーションに適用してください。
app.setPalette(qp)
アプリの基本的なテーマを作成する場合に行う必要があるのはこれだけです。 PyQt では、スタイルシートを使用してウィジェットの外観を定義することもできます。 CSS に精通している場合は、Qt スタイル シートを使用してアプリの高度なスタイルを簡単に定義できます。













