あれこれいじる

プログラミング、勉強してます

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を使うにあたって必須であるPythonC/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 StudioOpenGLを使用するために必要なライブラリです。

最後に
[構成プロパティ]->[C/C++]->[全般]->[追加のインクルードディレクトリ]
に同様にglfw3フォルダを選択すれば導入完了です。

#include <GLFW/glfw3.h>

とincludeすればglfw3の機能を使用できるはずです。

参考URL
Tutorial: Multiple Windows with GLFW3 and GLEW MX | Greg Nott