2012/10/02(火) [n年前の日記]
#1 [python] PyQt4のスクリプトをexe化してみたり
以下の記事を参考に作業してみたり。環境は Windows7 x64 Python 2.7.3 32bit等。
_PyQt を py2exe でフリージング -- Kosei Kitahara's Blog
_py2exeモジュールについて ・ PythonMatrixJp
_py2exeでハマったことの解決法 - 記憶は削除の方向で
_Py2exe 利用ノート
一応 exe ができた。素晴らしい。しかし、dist/ 以下が40MB近い容量になってしまった。なんだかデカ過ぎのような…でもないのかな…。QtWebKit4.dll てのが12MBぐらいあったりして。たぶんブラウザ相当がドカンと入っている予感。
IEやGoogleChrome等のブラウザ+JavaScriptなら、同じ処理をもっと小さいファイルサイズで実現できるのかなとチラリと思ったりもして。まあ、その代り、ブラウザ自体のファイルサイズが大きいわけだけど。
PyQt4 において、bmp と png 以外の画像を開くにはそれぞれに対応した dll が必要らしく。最低限、gif、jpeg、ico ぐらいは追加しておかないと、QWebView 上で画像が表示されなかった。
exe化したものを実行しても、モジュールが見つからない云々とエラーが出たので、includes にずらずらと列挙してみたり。これでいいのかどうかは分からんけど。
_PyQt を py2exe でフリージング -- Kosei Kitahara's Blog
_py2exeモジュールについて ・ PythonMatrixJp
_py2exeでハマったことの解決法 - 記憶は削除の方向で
_Py2exe 利用ノート
一応 exe ができた。素晴らしい。しかし、dist/ 以下が40MB近い容量になってしまった。なんだかデカ過ぎのような…でもないのかな…。QtWebKit4.dll てのが12MBぐらいあったりして。たぶんブラウザ相当がドカンと入っている予感。
IEやGoogleChrome等のブラウザ+JavaScriptなら、同じ処理をもっと小さいファイルサイズで実現できるのかなとチラリと思ったりもして。まあ、その代り、ブラウザ自体のファイルサイズが大きいわけだけど。
◎ アプリアイコンも追加してみたり。 :
以下の記事を参考に。
_ミニタイマー(10) ・ Windows 7 のアプリケーション・アイコン作成 | S.F.Page
_hajimen @ ウィキ - 実行しているスクリプトのパスを求める
アイコンは2種類が必要。
とりあえず、Inkscape で 256x256のpngを作成して、 _アイコン ウィザード を使わせてもらい、複数のアイコン画像が含まれている .ico を生成。setup.py に記述してみたり。
ウインドウのタイトルバーに表示されるアイコンについては、別途指定しないといけないらしい。とりあえず、48x48 の png を作成して、以下の記事を参考にしてスクリプト中で指定。
_First programs in PyQt4 toolkit
_ミニタイマー(10) ・ Windows 7 のアプリケーション・アイコン作成 | S.F.Page
_hajimen @ ウィキ - 実行しているスクリプトのパスを求める
アイコンは2種類が必要。
- exeファイルに割り当てる .ico ファイルのアイコン。
- ウインドウを表示した際のタイトルバーやタスクバーに表示する .png ファイルのアイコン。
とりあえず、Inkscape で 256x256のpngを作成して、 _アイコン ウィザード を使わせてもらい、複数のアイコン画像が含まれている .ico を生成。setup.py に記述してみたり。
ウインドウのタイトルバーに表示されるアイコンについては、別途指定しないといけないらしい。とりあえず、48x48 の png を作成して、以下の記事を参考にしてスクリプト中で指定。
_First programs in PyQt4 toolkit
self.setWindowIcon(QtGui.QIcon('web.png'))この行が、アイコンを指定している行らしい。
◎ setup.pyは以下のようになった。 :
#!/usr/bin/env python # -*- coding: utf-8 -*- # -*- mode: python;Encoding: utf8n -*- # # py2exeでexe化するための設定?ファイル from distutils.core import setup from glob import glob import os import sys import shutil if sys.platform == 'win32': """Windows用""" import py2exe # 開発環境のパスに合わせて修正すること WIN32UI_DIR = r"C:\Python27\Lib\site-packages\pythonwin" IMAGELIB_DIR = r"C:\Python27\Lib\site-packages\PyQt4\plugins\imageformats" # MFC dll を追加 mfcfiles = [os.path.join(WIN32UI_DIR, i) for i in [ "mfc90.dll", "mfc90u.dll", "mfcm90.dll", "mfcm90u.dll", "Microsoft.VC90.MFC.manifest"]] # 任意の画像フォーマットの dll を追加 imgfiles = [os.path.join(IMAGELIB_DIR, i) for i in [ "qgif4.dll", "qico4.dll", "qjpeg4.dll", "qmng4.dll", "qsvg4.dll", "qtiff4.dll",]] data_files = [ ("Microsoft.VC90.MFC", mfcfiles), ("imageformats", imgfiles), ] py2exe_options = { "compressed": 1, "optimize": 2, "bundle_files": 3, "includes" : ["sip", "PyQt4", "PyQt4.QtGui", "PyQt4.QtWebKit", "PyQt4.QtNetwork"] } setup( data_files = data_files, options={"py2exe" : py2exe_options}, windows=[{"script" : "markdowneditorpyqt.pyw", "icon_resources": [(1,"resource/icon.ico")]}], zipfile="zipped.lib", )mfc90*.dll 等は、Windows\winsxs\ 以下から持ってきている事例が多いのだけど。眺めてみても、どれがどれやらで。しかし、Pythonのインストールフォルダ以下に、pythonwin というのが入っていて、そこにも .dll があるらしく。それをコピーしてみることに。
PyQt4 において、bmp と png 以外の画像を開くにはそれぞれに対応した dll が必要らしく。最低限、gif、jpeg、ico ぐらいは追加しておかないと、QWebView 上で画像が表示されなかった。
exe化したものを実行しても、モジュールが見つからない云々とエラーが出たので、includes にずらずらと列挙してみたり。これでいいのかどうかは分からんけど。
◎ iniファイルへのアクセスを勉強中。 :
Python の ConfigParser とやらを使えば、iniファイルの作成・保存が簡単にできるらしく。試してみたら、たしかに簡単だった。調子に乗って、QMainWindows のウインドウ位置とサイズを記録復元するようにしてみたけれど。相変わらず、日本語のフォント名が記録できない…。どうすればいいんだろう…。
とりあえず、QMainWindow の位置とサイズは、.geometry() で取得、.setGeometry() で設定できるらしい、とメモ。QWidget のメソッドだけど。
とりあえず、QMainWindow の位置とサイズは、.geometry() で取得、.setGeometry() で設定できるらしい、とメモ。QWidget のメソッドだけど。
[ ツッコむ ]
#2 [prog] githubにアップしたはずの日本語ファイル名が文字化け
zipでDLしたら、日本語ファイル名・日本語フォルダ名が文字化けしてた…。
_UTF-8環境のGitで、日本語ファイル名が数値コードになってしまう問題 を参考に、git bash を開いて、
ただ、githubのソレは、zip化する際に文字化けしているような気もするわけで。とりあえず、日本語ファイル名・フォルダ名のものは削除しておいた。
_UTF-8環境のGitで、日本語ファイル名が数値コードになってしまう問題 を参考に、git bash を開いて、
git config --global core.quotepath falseと打ってみたり。
ただ、githubのソレは、zip化する際に文字化けしているような気もするわけで。とりあえず、日本語ファイル名・フォルダ名のものは削除しておいた。
[ ツッコむ ]
以上、1 日分です。