PyQt5 チュートリアル (2020年にPython GUIを作成する方法)

このPyQt5チュートリアルでは、Python 3とQtを使用して、Windows、Mac、またはLinuxでGUIを作成する方法を示します。アプリのインストーラーの作成についても説明します。

PyQt5とは何ですか?

PyQt は、PythonのQt GUIフレームワークを使用できるライブラリ です。Qt自体はC ++で書かれています。Pythonから使用することで、C ++の速度の多くを犠牲にすることなく、アプリケーションをより迅速に構築できます。

PyQt5はQtの最新バージョン5を指します。(Py)Qt4についてのWebでの言及が時折見られるかもしれませんが、古く、サポートされていません。

PyQtの興味深い新しい競合相手は Qt for PythonですそのAPIは実質的に同じです。PyQtとは異なり、LGPLの下でライセンスされているため、商用プロジェクトで無料で使用できます。それはQtの会社によって支えられており、したがって将来もそうです。PyQtはより成熟しているため、ここで使用します。APIは非常に似ているため、後でアプリをQt for Pythonに簡単に切り替えることができます。

PyQtをインストールする

Pythonで依存関係を管理する最良の方法は、 仮想環境を使用することです。仮想環境は、特定のプロジェクトのライブラリを含むローカルディレクトリです。これは、これらのライブラリのシステム全体のインストールとは異なり、他のすべてのプロジェクトにも影響します。

現在のディレクトリに仮想環境を作成するには、次のコマンドを実行します。

python3 -m venv venv

これによりvenv/フォルダが作成されます。Windowsで仮想環境をアクティブ化するには、次のコマンドを実行します。

call venv/scripts/activate.bat

MacおよびLinuxでは、以下を使用します。

source venv/bin/activate

(venv)シェルのプレフィックス によって、仮想環境がアクティブであることがわかり ます。

PyQtをインストールするには、次のコマンドを発行します

pip install PyQt5==5.9.2

バージョンを使用している理由5.9.2は、すべての(Py)Qtリリースが同じように安定しているわけではないためです このバージョンは動作することが保証されています。この微妙なことに加えて–おめでとうございます!PyQt5が正常に設定されました。

GUIを作成する

初めてのGUIアプリを書く時が来ました!仮想環境がアクティブな状態で、Pythonを起動します。次のコマンドを実行します。

まず、PythonにimportステートメントでPyQtを読み込むように指示します。

from PyQt5.QtWidgets import QApplication, QLabel

次に、次 のコマンドでを作成します  QApplication

app = QApplication([])

これはQtの要件です。すべてのGUIアプリには、のインスタンスが1つだけ必要ですQApplication上記の行を実行するまで、Qtの多くの部分は機能しません。したがって、あなたが書いたほぼすべての(Py)Qtアプリでそれが必要になります。

[]上記の行 の角括弧は、アプリケーションに渡されるコマンドライン引数を表します。アプリではパラメーターを使用しないため、角かっこは空のままにします。

次に、実際に何かを見るために、単純なラベルを作成します。

label = QLabel('Hello World!')

次に、Qtにラベルを画面に表示するように指示します。

label.show()

オペレーティングシステムに応じて、これはすでに小さなウィンドウを開きます。

最後のステップは、Qtに制御を渡し、「ユーザーが閉じるまでアプリケーションを実行する」ように要求することです。これは次のコマンドで行います:

app.exec_()

これがすべて期待どおりに機能した場合は、うまくいきました!PythonとQtを使用して最初のGUIアプリを作成しました。

ウィジェット

(Py)Qtアプリに表示されるものはすべて ウィジェットです。ボタン、ラベル、ウィンドウ、ダイアログ、プログレスバーなど。HTML要素と同様に、ウィジェットはしばしばネストされています。たとえば、ウィンドウにはボタンを含めることができ、ボタンにはラベルが含まれます。

次のスクリーンショットは、最も一般的なQtウィジェットを示しています。

上から下、左から右、次のとおりです。

興味があれば、 こちら のスクリーンショットに表示されているアプリのコードをダウンロードできます 

レイアウト

上記の例のように、GUIはおそらく複数のウィジェットで構成されます。この場合、それらの配置方法をQtに指示する必要があります。たとえば、 QVBoxLayout 使用 してウィジェットを垂直にスタックできます。

このスクリーンショットのコードは次のとおりです。

PyQt5.QtWidgetsからインポートQApplication、QWidget、QPushButton、QVBoxLayout

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
layout.addWidget(QPushButton('Top'))
layout.addWidget(QPushButton('Bottom'))
window.setLayout(layout)
window.show()
app.exec_()

前と同様に、をインスタンス化しQApplicationます。次に、を作成しwindowます。QWidgetコンテナとして機能し、特別な動作をさせたくないため、最も基本的なタイプを使用し ます。次に、を作成しlayout、それに2つQPushButtonのを追加 します。最後に、このレイアウト(およびその内容)を使用するようにウィンドウに指示します。私たちの最初のアプリケーションと同じように、私たちはへの呼び出しで終了.show() app.exec_()

もちろん、他にも多くの種類のレイアウトがあります(たとえば 、項目を一列にレイアウトする QHBoxLayout)。 概要については、 Qtのドキュメント 参照してください 

カスタムスタイル

Qtの強みの1つは、カスタムスタイルのサポートです。アプリケーションのルックアンドフィールをカスタマイズできるメカニズムは多数あります。このセクションでは、いくつかの概要を説明します。

組み込みスタイル

アプリケーションの外観を変更する最も粗い方法は、グローバル スタイルを設定すること です。上記のウィジェットのスクリーンショットを思い出してください:

これはと呼ばれるスタイルを使用しFusionます。Windows代わりにスタイルを使用すると、次のようになります。

スタイルを適用するには、次を使用しますapp.setStyle(…)

from PyQt5.QtWidgets import *
app = QApplication([])
app.setStyle('Fusion')
...

使用可能なスタイルは、お使いのプラットフォームに依存するが、通常はある 'Fusion''Windows' 'WindowsVista'(Windowsのみ)と 'Macintosh'する(Macのみ)。

カスタムカラー

スタイルが好きで、色を変更したい場合(暗いテーマなど)、QPalette を使用できます app.setPalette(…)例えば:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QPushButton

app = QApplication([])
app.setStyle('Fusion')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.red)
app.setPalette(palette)
button = QPushButton('Hello World')
button.show()
app.exec_()

これにより、ボタンのテキストの色が赤に変わります。

フュージョンスタイルの暗いテーマについては、 こちらをご覧 ください

スタイルシート

上記に加えて、スタイルシートを使用してアプリケーションの外観を変更できますこれはCSSのQtの類似物です。たとえば、これを使用してスペースを追加できます。

PyQt5.QtWidgetsからインポートQApplication、QPushButton

app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_()

スタイルシートの詳細については、 Qtのドキュメントを参照してください 

信号/スロット

Qtはシグナルと呼ばれるメカニズムを使用して、ユーザーがボタンをクリックするなどのイベントに反応できるようにします。次の例はこれを示しています。このボタンには、クリックするとメッセージボックスが表示されます。

from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Click')
def on_button_clicked():
    alert = QMessageBox()
    alert.setText('You clicked the button!')
    alert.exec_()


button.clicked.connect(on_button_clicked)
button.show()
app.exec_()

上記の興味深い行は強調表示されています。これ button.clickedはシグナルであり、 .connect(…)いわゆるスロットインストールできます これは単に、シグナルが発生したときに呼び出される関数です。上記の例では、スロットにメッセージボックスが表示されています。

C ++ではQtを使用する場合、スロットという用語は重要です。スロットはC ++では特別な方法で宣言する必要があるためです。ただし、Pythonでは、任意の関数をスロットにすることができます。これは上記で見ました。このため、スロットと「通常の」関数の違いは、私たちにはほとんど関係がありません。

Qtではシグナルはユビキタスです。そしてもちろん、独自のものを定義することもできます。ただし、これはこのチュートリアルの範囲を超えています。

アプリをコンパイルする

これで、ユーザー入力に応答するGUIを作成するための基本的な知識が身に付きました。アプリを作成したとしましょう。それはあなたのコンピューターで走ります。他の人にそれを提供して、彼らがそれを実行できるようにするにはどうすればよいですか?

上記のように、アプリのユーザーにPythonとPyQtのインストールを依頼してから、ソースコードを提供することができます。しかし、それは非常に面倒です(そして通常は非現実的です)。代わりに必要なのは、アプリのスタンドアロンバージョンです。つまり、他の人が何もインストールしなくても自分のシステムで実行できるバイナリ実行可能ファイルです。

Pythonの世界では、ソースコードを自己完結型の実行可能ファイルに変換するプロセスをフリーズと呼びます。PyInstaller、py2exe、cx_Freeze、bbfreze、py2appなど、この問題に対処する多くのライブラリがありますが、PyQtアプリのフリーズは、これまで驚くほど難しい問題でした。

PyQtアプリのスタンドアロン実行可能ファイルを作成できるfbs 呼ばれる新しいライブラリを使用し ます。これをインストールするには、次のコマンドを入力します。

pip install fbs

次に、以下を実行します。

fbs startproject

これにより、いくつかの値の入力を求められます。

提案されたrunコマンドを入力すると、空のウィンドウが開きます。

これは、以前に見たのと同じようなPyQt5アプリです。そのソースコードはsrc/main/python/main.py 現在のディレクトリにあります。しかし、ここがクールな部分です。fbsを使用して、スタンドアロンの実行可能ファイルに変換できます。

fbsがフリーズする

これにより、自己完結型のバイナリが target/MyApp/現在のディレクトリのフォルダに配置されます。あなたはそれを(あなたと同じOSの)あなたの友人に送ることができ、彼らはあなたのアプリを実行することができます!

(現在fbsはPython 3.5または3.6をターゲットにしています。別のバージョンがあり、上記が機能しない場合は、 Python 3.6 インストールして 再試行してください。macOSでは、 HomebrewでPython 3.5をインストールすることもできます 。)

おまけ:インストーラーを作成する

fbsでは、次のコマンドを使用してアプリのインストーラーを作成することもできますfbs installer

(Windowsを使用している場合は、最初にNSISをインストールしてPATHに配置する必要があり ます

コメントを残す

メールアドレスが公開されることはありません。

Next Post

Squish の代替および類似のソフトウェア

金 5月 8 , 2020
今日のアプリケーションのユーザーインターフェイスのテストは、非常に複雑でエラーが発生しやすい作業です。