14
14

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.

jupyter や Spyder IDE などでPyQt 系をやっていると、kernel restarting が頻繁に起きる問題の解決法

Last updated at Posted at 2016-08-19

PyQtやPyQtGraphなどでGUIのプログラムで試行錯誤をする際にも、
jupyterなどは便利でよく使っているのですが、
1つ最高に面倒な点があります。

PyQt系のGUIのプログラムを何度か動かしていると、

必ずkernel が死ぬのです。

そのことでやっと対処法を見つけました。

終了時のsys.exit() の有無は関係なかった。

これ→ sys.exit(app.exec_())

sys.exitが変に終了してるのが原因かと思ってましたが、こいつは無実でした。
終了時のsys.exit() の有無は(少なくともjupyterでは)関係なかった。(Spyderは未確認)

appを直前に別のもので上書きするだけ!(PyQt4のみ。PySideでは使えません)

app = 0 #この行を追加
app = QtGui.QApplication(sys.argv)

これだけで、何度も同じコードをjupyterで動かしても、
鬱陶しいkernel restart がなくなった!やったー!

参考
https://www.reddit.com/r/learnpython/comments/45h05k/solved_kernel_crashing_when_closing_gui_spyder/


2016/09/01追記

コメントのmojaieさんのやり方でもいけました。
どう考えてもこちらの方法のが真っ当ですね。

app = QtGui.QApplication.instance()
if app is None:
    app = QtGui.QApplication(()) 

また、PyQt4は無言で実行してkernelが死ぬのに対し、
PySideだとQApplicationの多重のインスタンス作成を事前に阻止してランタイムエラーを返してくれることに衝撃を受けました。
PyQt4とPySideの育ちの違いですね。。。

また、PySideではランタイムエラーが起きるため、app=0は使えません。
app=0 は、PyQt4用のおまじないということで・・・

14
14
3

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
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?