この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に配置する必要があり ます)