【问题标题】:Update PyQt widget through ipython/jupyter notebook cells通过 ipython/jupyter 笔记本单元更新 PyQt 小部件
【发布时间】:2016-10-15 20:28:02
【问题描述】:

我有一个烦人的问题,过去几个月我一直无法解决。基本上,我使用 jupyter/ipython notebook 来调用 pyqt 并显示 3d 几何数据。这就是我将应用程序初始化为对象的方式,在添加了一些多边形和点之后,我调用了 show():

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 notebook 中调用 show() 命令,我就无法再运行任何单元格或更新小部件,因为 notebook 输出排队(?)并被锁定:

#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()
                ...

我已尝试遵循相关建议,但我不明白如何在小部件之外使用连接或事件。

感谢任何帮助,我花了很多时间试图解决这个问题,这很尴尬。猫

【问题讨论】:

    标签: events pyqt ipython jupyter


    【解决方案1】:

    我在 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_()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2016-02-04
      • 2017-08-04
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2013-03-18
      相关资源
      最近更新 更多