検証環境
- Python 2.7 (WinPython-32bit-2.7.10.3)
- Spyder 3.0.0 (同梱)
- PyQt4
- Windows7
- cx_Freeze
setup.py
from cx_Freeze import setup, Executable
exe = Executable(script = 'script.py', base = None)
setup(name = 'name',
version = '0.1',
description = '',
executables = [exe])
症状
exe化したものの実行にのみ発生する。
ウィンドウの閉じるボタンではなく、自作したGUIからQtを終了すると、アプリの動作が停止する。
エラーメッセージ
通常は出ないが、base = None
で実行してVSでデバッグを行うと確認できた。
ハンドルされない例外が 0xXXXXXXXX (QtGui4.dll) で発生しました
0xC0000005: 場所 0xXXXXXXXX への読み込み中にアクセス違反が発生しました。
場所(アドレス)は変動する。
コード
import sys
from PIL import ImageGrab
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
quit = QtGui.QPushButton('Quit')
quit.clicked.connect(app.exit)
mw = QtGui.QMainWindow()
mw.setCentralWidget(quit)
mw.show()
app.aboutToQuit.connect(app.deleteLater)
app.exec_()
対処
import sys
from PIL import ImageGrab
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
quit = QtGui.QPushButton('Quit')
quit.clicked.connect(sys.exit)
mw = QtGui.QMainWindow()
mw.setCentralWidget(quit)
mw.show()
app.aboutToQuit.connect(app.deleteLater)
app.exec_()
QApplicationを終了するのではなくsys.exitでプログラムを終了させる。
ただし、こちらは自分の開発環境ではカーネルが死んだりするので開発中はappを閉じて、ビルドするときに書き換えたりする。
ウィンドウデフォルトの閉じるボタンを押すエミュレートなどができればそちらがいいだろうか。