[[ノート/ノート]]~
&counter();   &lastmod();~

**PythonアプリのWin上でのexe化  2017-01-01 [#gd7eaab3]

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

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

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

***そもそもWindowsへのPythonのインストール [#f11bda29]
裸よりは、Anacondaが楽なようだ。今だとAnaconda3でPython3をインストールしてしまうことになる。

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

***PyQt5のインストール [#lda1aceb]
anacondaに入っているみたい。いろいろ入れてみたけれど、anacondaインストール直後で使えた。

***Qt5を使ったサンプルプログラム [#q2b42179]
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のインストール [#f2c1399e]
pipで簡単にインストールできる。
 pip install pyinstaller

***PyInstallerによるパッケージング [#qb3516ad]
 pyinstaller -F --noconsole myfact.py

結果として、ディレクトリdistの下に
 2017/01/02  14:32        28,955,732 myfact.exe
ができた。Pythonの実行環境とQtの環境を全部パッケージしているので、29MBと、かなり大きい。

**Qt5プログラミング続き [#k069c2cc]
漢字も問題なく使えるようだが、Windows上でShift-JISで漢字文字列定数を入れると怒られる。エディタでUTF-8でストアするようにしておけば、大丈夫だった。


サンプル集
-[[Qt 定番小ワザ集:http://mf-atelier.sakura.ne.jp/mf-atelier/modules/tips/program/Qt/qt_tips.html]]
-[[【PythonでGUI】PyQt5 -ダイアログ-:http://qiita.com/Algebra_nobu/items/acd3caa625be8eebc09c]]
-
-[[Qt:https://wiki.archlinuxjp.org/index.php/Qt]]

UI作成ツールについて
-[[PyQt5 利用ノート:https://showa-yojyo.github.io/notebook/python-pyqt5.html]] は結構新しめかも。

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

古いけれどこんなのもあった。
-[[Python3とPyQT5でGUIアプリ作成 〜GUI画面作成編〜:http://vendettaweb.net/?p=125]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS