Leo IPython integration with qt graphing library

75 views
Skip to first unread message

john lunzer

unread,
Mar 13, 2015, 12:40:03 PM3/13/15
to leo-e...@googlegroups.com
I make heavy use of a library called PyQtGraph. I am trying to:

import pyqtgraph as pg

But in the Leo IPython qtconsole I am getting:

import pyqtgraph as pg

---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-1-e5a51b506085> in <module>()
----> 1 import pyqtgraph as pg


C
:\Anaconda\lib\site-packages\pyqtgraph\__init__.py in <module>()
     
11 ## 'Qt' is a local module; it is intended mainly to cover up the differences
     
12 ## between PyQt4 and PySide.
---> 13 from .Qt import QtGui
     
14
     
15 ## not really safe--If we accidentally create another QApplication, the process hangs (and it is very difficult to trace the cause)


C
:\Anaconda\lib\site-packages\pyqtgraph\Qt.py in <module>()
     
30             USE_PYSIDE = True
     
31         except ImportError:
---> 32             raise Exception("PyQtGraph requires either PyQt4 or PySide; neither package could be imported.")
     
33
     
34 if USE_PYSIDE:


Exception: PyQtGraph requires either PyQt4 or PySide; neither package could be imported.

I have also cross posted to the pyqtgraph developer's google group.

I found that if I attempt the same import in a standalone IPython QtConsole window using the "--gui=qt" tag I get the same error, so I'm wondering if Leo uses the same tag. And possibly how we can get around it.

I'm very excited by what Leo has to offer, specifically using clones.

john lunzer

unread,
Mar 14, 2015, 12:32:12 PM3/14/15
to leo-e...@googlegroups.com
I think I've made some progress on this. I posted a bug report ( https://github.com/leo-editor/leo-editor/issues/155 ) that I believe is related but I don't know how to fix either one.

My discovery came from doing some experiments with a stand alone ipython qt console. I believe these issues are coming from using the Qt API v1 versus the v2 ( think it should always be using v2). 

If you: 
import PyQt4

%gui qt

import PyQt4

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-0c3b8c686717> in <module>()
----> 1 import PyQt4

C:\Anaconda\lib\site-packages\IPython\external\qt_loaders.pyc in load_module(self, fullname)
     45     Importing %s disabled by IPython, which has
     46     already imported an Incompatible QT Binding: %s
---> 47     """ % (fullname, loaded_api()))
     48 
     49 ID = ImportDenier()

ImportError: 
    Importing PyQt4 disabled by IPython, which has
    already imported an Incompatible QT Binding: pyqtv1


The second import will fail.

I found a lead on, http://cyrille.rossant.net/making-pyqt4-pyside-and-ipython-work-together/ which contains the following code snippit:

import sip
try:
    sip
.setapi('QDate', 2)
    sip
.setapi('QDateTime', 2)
    sip
.setapi('QString', 2)
    sip
.setapi('QtextStream', 2)
    sip
.setapi('Qtime', 2)
    sip
.setapi('QUrl', 2)
    sip
.setapi('QVariant', 2)
except ValueError, e:
   
raise RuntimeError('Could not set API version (%s): did you import PyQt4 directly?' % e)

Now if in the stand alone if I run: 

import PyQt4

import sip
try:
    sip.setapi('QDate', 2)
    sip.setapi('QDateTime', 2)
    sip.setapi('QString', 2)
    sip.setapi('QtextStream', 2)
    sip.setapi('Qtime', 2)
    sip.setapi('QUrl', 2)
    sip.setapi('QVariant', 2)
except ValueError, e:
    raise RuntimeError('Could not set API version (%s): did you import PyQt4 directly?' % e)

%gui qt

import PyQt4

Both imports succeed.

Two things, I wouldn't know where to add Cyrille's code snippet and I'm also not sure what the "%gui qt" magic is doing programmatically. I will also add this finding to the bug report.

If anyone has any thoughts on making sure the v2 API is loaded please let me know.

john lunzer

unread,
Mar 14, 2015, 9:28:26 PM3/14/15
to leo-e...@googlegroups.com
I found a resolution. Updating Ipython to 3.0.0. The way you initialize your ipython qtconsole with the "--pylab=qt" tag allows pyqtgraph to fully integrate with ILeo.

Awesome. This also fixes the bug from the bug report, which I will update.
Reply all
Reply to author
Forward
0 new messages