私はPyQt4に基づいてGUIを備えた大きなPythonプログラムを作成しました。私は、このパッケージをIPythonノートブック(WindowsでPython 2.7を使った古いインストール)、Jupyterノート(最近Python 3.5をAnacondaでインストールしたもの)、およびコマンドラインでPythonプログラムとして使うことをお勧めします。 Jupyterのノートブックでコードを実行する際に問題が発生しています(下部に直接表示されています)。なぜPyQt4はJupyterとIPythonノートブックの動作が違うのですか?
マイモジュールmymodule.pyは、この(非常に簡略化され、他の多くのpythonファイルからのショーの前におよそ10Kライン)のように見える:
from PyQt4 import QtCore, QtGui
class MyModule(object):
def __init__(self):
self.window = QtGui.QMainWindow()
self.window.show()
、コマンドラインからの典型的な使用法がある
python myscript.py
次のファイルでmyscript.py
from PyQt4 import QtCore, QtGui
import mymodule
m = mymodule.MyModule()
APP = QtGui.QApplication.instance()
APP.exec_()
この動作は問題ありません。 Guiの対話イベントを通して動作するEventLoopを起動するには、APP.exec_()が必要であることを理解しています。 IPythonのノートブックで
、ユーザーは通常、
import mymodule
m = mymodule.MyModule() # opens the gui
# this still leaves the console active to allow things like this:
m.change_color("red")
をして私はIPythonは何とかシーンの背後にあるイベントループの世話をすることunderstant問題、せずにこれを実行することができます。
Jupyterノートブックで同じコマンドを実行すると、ウィンドウが開きますが、ユーザーの操作を許可する前にフリーズします。だから私は、ジュピターのノートブックは、そうするように言わなかったので、イベントを適切に扱わないと信じています。私が見つけた1つの方法は、コードを実行する前にコマンド%pylab
を実行することです。しかし、プログラムを起動する前に%pylab
と%matplotlib inline
を連続して実行しているときなど、私は頻繁にこれに関連した問題に遭遇します。これはコードをロードすると凍結します(奇妙なことに、 。また、私のプログラムのユーザには、新しいノートブックに%pylabを強制的に実行させたくない場合もあります(私のプログラムの要件ではないmatlabのインストールが必要だと思うからです)。
Jupyterノートブックで説明されているユーザコードと互換性があるようにするには、mymodule.pyにどのようなコードを追加する必要がありますか?誰もが、IPythonのノートブックやJupyterのノートブックがQEventLoop/QApplication(あるいは重要なコンセプトは何であるか)をどうやって違った方法で管理しているのか、そして魔法のコマンドがこれをどのように混乱させるのかをもっと明確に説明できますか?私はこのために私のプログラムに隠されたバグを恐れており、ユーザを苛立たせないようにできるだけ頑強にしたいと考えています。