Windows+PyQt5+Python3で作ったプログラムをバイナリ化
PyQtのプログラムをバイナリ化する方法は色々あるみたいだけど、
あんまりPython3には対応していない模様。
対応してるのがこれ
cx_Freeze
そのためこれを導入するのだけど、いたって簡単というかWindows用には
バイナリファイルしかないので落としてきてインストールするだけ。
…なんだけど、バイナリ化するときにエラーが出る。
なんとバグらしい。
cx freeze - CX_Freeze for my python script -- Fix up module error? - Stack Overflow
だからこのサイトから、非公式のwheelを入れなきゃならない。
Python Extension Packages for Windows - Christoph Gohlke
wheelの入れ方は調べればいくつもでてくるので割愛。
wheelさえ入ればこっちのものである。
以下のコードをsetup.pyに記述。
import sys from cx_Freeze import setup, Executable base = None if sys.platform == "win32": base = "Win32GUI" setup( name = "sample", version = "1.0", description = "converter", executables = [Executable("test.py", base=base)])
※test.pyは任意のファイル名です
その後コマンドラインでこれを
python setup.py built
実行すればbuiltディレクトリが出来る。んでその中にexeファイルがあります。
一件落着。
WindowsでPyQt5 + Python3の環境設定
環境設定系は書いておくと誰かの助けになるはずなので。。。
とりあえずPython3のインストールは終わってるものとします。
Riverbank | Software | PyQt | PyQt5 Download
ここからWindows用のzipファイルを落してきて解凍してワーキングディレクトリにぶち込む。
Riverbank | Software | SIP | SIP Download
また、PyQtを使うにあたって必須であるPythonとC/C++のバインディング用のSIPも落としてきます。
(SIPについて詳しくは Riverbank | Software | SIP | What is SIP?)
解凍してワーキングディレクトリにぶち込んだSIPのディレクトリに飛びます。
以下のコマンドを実行。
>python configure.py >nmake >nmake install
次に、PyQtのディレクトリで同じようにコマンドを実行してやるんだけど、
qmakeのPATHを通さなきゃならない。
>set PATH=%PATH%;C:\Qt\(Qtのバージョン)\(コンパイラ)\bin >python configure.py >nmake >nmake install
これで環境設定は出来るはずです。
まぁこんなことしなくても便利なexe形式のバイナリが公式のsourceforgeにあるけどね…
コンパイルエラーがでる場合は
python configure.py -w
ていうオプションを与えてやれば、何がエラーを起こしてるかわかるはずです。
僕の場合はなぜかnmakeがエラー吐いてうまくいかず、
VisualStudioを再インストールしたり、
コマンドプロンプトをいくつか試してみたり、
バージョンの違うVisualStudioを試してみたり
色々時間がかかってしまった。
動作確認用プログラムでもどうぞ
from PyQt5.QtWidgets import * class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.button = QPushButton("What time is it now?") self.button.clicked.connect(self.getNowTime) mainLayout = QHBoxLayout() mainLayout.addWidget(self.button) self.setLayout(mainLayout) self.setWindowTitle("PyQtTest") def getNowTime(self): import re from datetime import datetime now = str(datetime.now()) dateWord = ["年","月","日","時","分","秒"] msgBox = QMessageBox() msgBox.setText("".join([i + j for i,j in zip(re.split(r"[- :.]",now),dateWord)]) + "です") msgBox.exec() if __name__ == '__main__': import sys app = QApplication(sys.argv) mw = MainWindow() mw.show() sys.exit(app.exec_())
GLFW3の導入
1.GLFW3のダウンロード
GLFW - An OpenGL library
ここからダウンロード及び解凍
2.CMakeでビルド
http://www.cmake.org/cmake/resources/software.html
ここからexe形式のCMakeをダウンロード、インストール。
Where is the source codeのところを解凍したディレクトリに設定
Where to build the binariesのところを適当に作ったディレクトリに設定(どこでもいいです)
Configureをクリックしてvsのversionを選択
Generateをクリックして生成。
生成されたslnファイルをVisual Studioで起動してReleaseでBuildしてください。
これでCMakeは終了
3.必要ファイルのコピー
まず、自分のプロジェクトがあるディレクトリに、librariesとか適当なディレクトリを作成。
その下にglfw3とか適当なフォルダを作成。
次に
(作成したディレクトリ名)/src/Release/
にあるglfw3.libをglfw3フォルダの下にコピー。
また解凍したフォルダの中にある、includeの下のGLFWフォルダを
glfw3フォルダの下ににコピー。
必要なのはこの2つだけです
3.VisualStudio側の設定
自分のプロジェクトのプロパティを開いて
[構成プロパティ]->[リンカー]->[全般]->[追加のライブラリディレクトリ]
で先ほどのglfw3フォルダを選択
[構成プロパティ]->[リンカー]->[入力]->[追加の依存ファイル]
で
glfw3.lib
opengl32.lib
glu32.lib
を入力
opengl32とglu32はVisual StudioでOpenGLを使用するために必要なライブラリです。
最後に
[構成プロパティ]->[C/C++]->[全般]->[追加のインクルードディレクトリ]
に同様にglfw3フォルダを選択すれば導入完了です。
#include <GLFW/glfw3.h>
とincludeすればglfw3の機能を使用できるはずです。
参考URL
Tutorial: Multiple Windows with GLFW3 and GLEW MX | Greg Nott