工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Python

例を含む PyQt5 チュートリアル:Python で PyQt を使用して GUI を設計する

PyQt とは

PyQt クロスプラットフォーム アプリケーション開発フレームワークとしても機能する、オープン ソースのウィジェット ツールキット Qt の Python バインディングです。 Qt は、すべての主要なデスクトップ、モバイル、組み込みプラットフォーム用の GUI アプリケーションを作成するための一般的な C++ フレームワークです (Linux、Windows、MacOS、Android、iOS、Raspberry Pi などをサポートしています)。

この PyQt5 チュートリアルでは、次のことを学びます:

PyQT の機能

PyQt の重要な機能は次のとおりです。

次のようなさまざまな機能をカバーする 600 以上のクラスで構成される PyQt について学びます

これらの機能を組み合わせて、高度な 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 つの方法について説明します。

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 で使用される基本的なモジュールです。

    PyQt5 ウィジェット

    これは、PyQt5 で最も頻繁に使用されるウィジェットのリストです

    レイアウトとテーマ

    前の PyQt5 の例では、GUI でウィジェットの位置を設定するために move() および resize() メソッドのみを使用していました。

    ただし、PyQt には堅牢なレイアウト管理エンジンがあり、アプリケーションの高度なユーザー インターフェイスを作成するために使用できます。このセクションでは、Qt でレイアウトの作成と管理に使用される 2 つの重要なクラスについて学習します。

    <オール>
  • QBoxLayout
  • QGridLayout
  • QBoxLayout

    QBoxLayout は、レイアウトの子ウィジェットを水平または垂直の行に配置するために使用されます。 QBoxLayout から継承する対象となる 2 つのクラスは次のとおりです。

    たとえば、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() メソッドは次の引数を取ります:

    理解を深めるために、以下に示すように各ウィジェットを手動で挿入できます

    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 スタイル シートを使用してアプリの高度なスタイルを簡単に定義できます。

    まとめ


    Python

    1. 例を含む C# コレクションのチュートリアル
    2. Python Print() ステートメント:例を使用して印刷する方法
    3. 例を使用した Python 文字列 count()
    4. Python String format() 例で説明
    5. Python String find() メソッドと例
    6. 例を含む Python Lambda 関数
    7. 例を使用した Python round() 関数
    8. 例を使用した Python map() 関数
    9. Python Timeit() と例
    10. 例を使用したコレクション内の Python カウンター
    11. Python の type() と isinstance() と例