0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

開発環境では動くけれどビルドするとエラーを吐くPyQtコード:ボタン(Qt)による終了

Posted at

検証環境

  • 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を閉じて、ビルドするときに書き換えたりする。

ウィンドウデフォルトの閉じるボタンを押すエミュレートなどができればそちらがいいだろうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?