このPyQt5チュートリアルでは、Python 3とQtを使用して、Windows、Mac、またはLinuxでGUIを作成する方法を示します。アプリのインストーラーの作成についても説明しています。
PyQt5とは何ですか?
PyQt は、PythonのQt GUIフレームワークを使用できるライブラリ です。Qt自体はC ++で記述されています。Pythonから使用することにより、C ++の速度の多くを犠牲にすることなく、アプリケーションをより迅速に構築できます。
PyQt5はQtの最新バージョン5を指します。まだWebで(Py)Qt4について言及していることがありますが、古いものであり、サポートされていません。
PyQtの興味深い新しいライバルは、 Qt for Pythonです。そのAPIは実質的に同じです。PyQtとは異なり、LGPLの下でライセンスされているため、商用プロジェクトで無料で使用できます。それはQt会社に支えられており、したがって将来もそうです。PyQtはより成熟しているため、ここで使用します。APIは非常に似ているため、後で簡単にアプリをQt for Pythonに切り替えることができます。
PyQtをインストールする
Pythonで依存関係を管理する最良の方法は、 仮想環境を使用することです。仮想環境は、特定のプロジェクトのライブラリを含むローカルディレクトリにすぎません。これは、これらのライブラリのシステム全体のインストールとは異なり、他のすべてのプロジェクトにも影響します。
現在のディレクトリに仮想環境を作成するには、次のコマンドを実行します。
python3 -m venv venv
これにより、venv/フォルダーが作成されます。Windowsで仮想環境をアクティブにするには、次を実行します。
venv / scripts / activate.batを呼び出します
MacおよびLinuxでは、次を使用します。
ソースvenv / bin / activate
仮想環境がアクティブであることは (venv)、シェルのプレフィックスで確認できます。
PyQtをインストールするには、次のコマンドを発行します。
pip install PyQt5 == 5.9.2
バージョンを使用する理由5.9.2は、すべての(Py)Qtリリースが同等に安定しているわけではないためです 。このバージョンは動作が保証されています。この微妙さに加えて-おめでとうございます!PyQt5のセットアップが完了しました。
GUIを作成する
初めてのGUIアプリを作成しましょう!仮想環境がまだアクティブな状態で、Pythonを起動します。次のコマンドを実行します。
まず、Pythonにimportステートメントを介してPyQtをロードするように指示します。
PyQt5.QtWidgetsから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をインポート
app = QApplication([])
ウィンドウ= QWidget()
レイアウト= 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(…)。
PyQt5.QtWidgetsインポートから*
app = QApplication([])
app.setStyle( 'Fusion')
…
使用可能なスタイルは、お使いのプラットフォームに依存するが、通常はある 'Fusion'、'Windows'、 'WindowsVista'(Windowsのみ)と 'Macintosh'する(Macのみ)。
カスタムカラー
スタイルが好きで、その色を変更したい場合(たとえば、暗いテーマに)、QPalette とを使用できます app.setPalette(…)。例えば:
PyQt5.QtCoreからQtをインポート
PyQt5.QtGuiからQPaletteをインポート
PyQt5.QtWidgetsからQApplication、QPushButtonをインポート
app = QApplication([])
app.setStyle( 'Fusion')パレット= QPalette()
palette.setColor(QPalette.ButtonText、Qt.red)
app.setPalette(パレット)
button = QPushButton( 'Hello World')
button.show()
app.exec_()
これにより、ボタンのテキストの色が赤に変わります。
Fusionスタイルの暗いテーマについては、 こちらをご覧 ください。
スタイルシート
上記に加えて、スタイルシートを使用してアプリケーションの外観を変更できます。これはQtのCSSの類似物です。これを使用して、たとえば間隔を追加できます。
PyQt5.QtWidgetsからQApplication、QPushButtonをインポート
app = QApplication([])app.setStyleSheet( "QPushButton {margin:10ex;}")
button = QPushButton( 'Hello World')
button.show()
app.exec_()
スタイルシートの詳細については、 Qtのドキュメントを参照してください 。
信号/スロット
Qtはシグナルと呼ばれるメカニズムを使用して、ユーザーがボタンをクリックするなどのイベントに反応できるようにします。次の例はこれを示しています。クリックすると、メッセージボックスを表示するボタンが含まれています。
PyQt5.QtWidgetsインポートから*
app = QApplication([])
button = QPushButton( 'Click')
def on_button_clicked():
アラート= QMessageBox()
alert.setText( 'ボタンをクリックしました!')
alert.exec_()
button.clicked.connect(on_button_clicked)
button.show()
app.exec_()
興味深い行が上に強調表示されています: button.clickedシグナルで、 .connect(…)いわゆるスロットをインストールできます 。これは、信号が発生したときに呼び出される関数です。上記の例では、スロットにメッセージボックスが表示されています。
C ++ではスロットを特別な方法で宣言する必要があるため、C ++からQtを使用する場合、スロットという用語は重要です。ただし、Pythonでは、任意の関数をスロットにすることができます。これは上記で見ました。このため、スロットと「通常の」機能の違いは、ほとんど関係ありません。
Qtではシグナルはどこにでもあります。そしてもちろん、独自に定義することもできます。ただし、これはこのチュートリアルの範囲外です。
アプリをコンパイルする
これで、ユーザー入力に応答するGUIを作成するための基本的な知識が得られました。アプリを書いたとしましょう。コンピューターで実行されます。他の人にどのように渡すのですか?
上記のように、アプリのユーザーにPythonとPyQtをインストールするように依頼してから、ソースコードを渡すことができます。しかし、それは非常に退屈です(通常は非実用的です)。代わりに欲しいのは、アプリのスタンドアロンバージョンです。つまり、他の人が何もインストールしなくてもシステムで実行できるバイナリ実行可能ファイルです。
Pythonの世界では、ソースコードを自己完結型の実行可能ファイルに変換するプロセスをfreezingと呼びます。PyInstaller、py2exe、cx_Freeze、bbfreze、py2appなど、この問題に対処するライブラリが多数ありますが、PyQtアプリの凍結は従来、驚くほど難しい問題でした。
PbQtアプリ用のスタンドアロンの実行可能ファイルを作成できる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では、 Python 3.5をHomebrewでインストールすることもできます 。)
ボーナス:インストーラーを作成する
fbsでは、コマンドを使用してアプリのインストーラーを作成することもできますfbs installer。
(Windowsを使用している場合は、最初にNSISをインストールしてに配置する必要があり ますPATH。)
既存のアプリケーションでfbsを使用する方法の詳細については、 この記事を参照し てください。または fbsのチュートリアル。