ノート/ノート
1905   2017-01-06 (金) 17:53:26

PythonアプリのWin上でのexe化  2017-01-01

Pythonアプリを(Pythonインタープリタを持っていない)Windows上で動かすために、パッケージ化をすることになるのだが、いくつかの仕組がある。

いろいろな人がいろいろ言っていて、よくわからないのだが、cx_Freezeはいろいろ試してみると、どうも指定はいろいろできるが、使い慣れないとうまくいかないみたいだ。

他方、PyInstallerはほとんど何もしなくてよいので便利だが、その分自由度がないのと、もしかすると環境のバージョンに依存して動かなくなることがあるのかもしれない。

そもそもWindowsへのPythonのインストール

裸よりは、Anacondaが楽なようだ。今だとAnaconda3でPython3をインストールしてしまうことになる。

Anaconda で Python 環境をインストールする に従うと、Anacondaのダウンロードページ https://www.continuum.io/downloads から(今だとPython3.5を選んで)インストール。3.6は出たてなので、いろいろと足りないものがある。

PyQt5のインストール

anacondaに入っているみたい。いろいろ入れてみたけれど、anacondaインストール直後で使えた。

Qt5を使ったサンプルプログラム

Windowsアプリの場合はコンソールを介したくない(アイコンをダブルクリックして終わり)という感覚があるので、どうしてもGUIを作りこむ必要がある。PythonでGUIを何にするかも大きな決断だが、割とよく見かけるQtを使ってみる。Qtのバージョンも4がいいのか新しい5がいいのか? ネットを検索すると古いサンプルが多いのだが、まあ新しいバージョンにしておこう。どうしてアッパーコンパチにならないのか?

何もしないウィンドウ

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    sys.exit(app.exec_())

入力を受け取って階乗を計算するプログラム

#!/usr/bin/env python

from PyQt5.QtWidgets import (QApplication, QWidget,
                             QGridLayout, QVBoxLayout, QHBoxLayout,
                             QLabel, QLineEdit, QPushButton)

def factorial(n):
    if n < 0:
        return -1
    elif n == 0:
        return 1
    else:
        return n * factorial(n-1)

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
 
        self.inputLine = QLineEdit()
        self.outputLine = QLineEdit()
        self.outputLine.setReadOnly(True)

        self.calcButton = QPushButton("&Calc")
        self.calcButton.clicked.connect(self.calc)

        lineLayout = QGridLayout()
        lineLayout.addWidget(QLabel("num"), 0, 0)
        lineLayout.addWidget(self.inputLine, 0, 1)
        lineLayout.addWidget(QLabel("result"), 1, 0)
        lineLayout.addWidget(self.outputLine, 1, 1)

        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(self.calcButton)

        mainLayout = QHBoxLayout()
        mainLayout.addLayout(lineLayout)
        mainLayout.addLayout(buttonLayout)

        self.setLayout(mainLayout)
        self.setWindowTitle("Factorial")

    def calc(self):
        n = int(self.inputLine.text())
        r = factorial(n)
        self.outputLine.setText(str(r))

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

PyInstallerのインストール

pipで簡単にインストールできる。

pip install pyinstaller

PyInstallerによるパッケージング

pyinstaller -F --noconsole myfact.py

結果として、ディレクトリdistの下に

2017/01/02  14:32        28,955,732 myfact.exe

ができた。Pythonの実行環境とQtの環境を全部パッケージしているので、29MBと、かなり大きい。

Qt5プログラミング続き

漢字も問題なく使えるようだが、Windows上でShift-JISで漢字文字列定数を入れると怒られる。エディタでUTF-8でストアするようにしておけば、大丈夫だった。

サンプル集

UI作成ツールについて

Windows下でAnaconda3を入れた環境で、(HOME)\Anaconda3\Library\bin\designer.exeを起動すればよいらしい。 パスが通っているらしいので、コマンドプロンプトで単にdesingerとすればよかった。

古いけれどこんなのもあった。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-01-06 (金) 17:53:26 (226d)