2016-10-15 9 views
2

私は過去数ヶ月間解決できなかった厄介な問題があります。基本的には、pyqtを呼び出して3次元の幾何データを表示するために、jupyter/ipythonノートブックを使用しています。これは)私がオブジェクトにアプリを初期化し、私はいくつかのポリゴンとポイントを追加した後、私は(ショーを呼び出す方法です:ipython/jupyterノートブックセルからPyQtウィジェットを更新する

class Figure(object): 
    ''' 
    Main API functions 
    ''' 

    def __init__(self): 
     print "... initializing canvas ..." 
     self.app = QApplication(sys.argv) 
     self.app.processEvents() 
     ... 

    def show(self): #Show 
     self.GUI = GLWindow(data) 
     self.app.exec_() 

私は継続的にウィジェットがノートブックのセルを更新/対話したいと思います。 (?)私はjupyterノートブックでshow()コマンドを呼び出した後、ノートブックの出力はキューに入れられ、ロックアウトされますようしかし、私はこれ以上のセルを実行したり、ウィジェットを更新することはできません。

#Initialize figure object inside the notebook 
fig = plb.figure() 
... 
fig.show() #Locks out any further jupyter commands while widget on screen 
fig.update() #Does not get executed until widget is closed 

それは.SHOWですノートブックを介して呼び出される関数()は、Pythonカーネル(?)の制御を放棄しますが、それを元に戻す方法と、表示されているウィジェットに接続する方法は不明です。

マウスやキーボードのイベントがウィジェットと対話んが、ウィジェットのコード内にあるmouseMoveEventのような組み込み関数を()を使用します

class GLWindow(QtGui.QWidget): 

     def __init__(self, fig, parent=None): 
      QtGui.QWidget.__init__(self, parent) 

      self.glWidget = GLWidget(fig, parent=self) 
      ... 

    class GLWidget(QtOpenGL.QGLWidget): 

      def __init__(self, fig, parent=None): 
       QtOpenGL.QGLWidget.__init__(self, parent) 
       ... 

      def mouseMoveEvent(self, event): 
       buttons = event.buttons() 
       modifiers = event.modifiers() 
       dx = event.x() - self.lastPos.x() 
       dy = event.y() - self.lastPos.y() 
       ... 

私は、関連の提案に従うことを試みたが、私はしないでくださいウィジェットの外で接続やイベントを使用する方法を理解する。

何か助けていただければ幸いです。私はこれを修正しようと多くの時間を費やしましたが、恥ずかしいです。 Cat

答えて

4

jupyterフォーラムの助けを借りて解決策が見つかりました。明らかに、ここで説明しているノートブックには実行時のトリックがあり、glwindowと動的に対話することができます。最終的にはこの問題を解決するために非常に満足して...ここでhttps://github.com/ipython/ipython/blob/master/examples/IPython%20Kernel/gui/gui-qt.py

は例が将来的に削除された場合には、全体の機能です:

#!/usr/bin/env python 
"""Simple Qt4 example to manually test event loop integration. 
This is meant to run tests manually in ipython as: 

In [5]: %gui qt 

In [6]: %run gui-qt.py 

Ref: Modified from http://zetcode.com/tutorials/pyqt4/firstprograms/ 
""" 

from PyQt4 import QtGui, QtCore 

class SimpleWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

     self.setGeometry(300, 300, 200, 80) 
     self.setWindowTitle('Hello World') 

     quit = QtGui.QPushButton('Close', self) 
     quit.setGeometry(10, 10, 60, 35) 

     self.connect(quit, QtCore.SIGNAL('clicked()'), 
        self, QtCore.SLOT('close()')) 

if __name__ == '__main__': 
    app = QtCore.QCoreApplication.instance() 
    if app is None: 
     app = QtGui.QApplication([]) 

    sw = SimpleWindow() 
    sw.show() 

    try: 
     from IPython.lib.guisupport import start_event_loop_qt4 
     start_event_loop_qt4(app) 
    except ImportError: 
     app.exec_() 
関連する問題