Show More
@@ -1,4 +1,9 b'' | |||||
1 | """ A Qt API selector that can be used to switch between PyQt and PySide. |
|
1 | """ A Qt API selector that can be used to switch between PyQt and PySide. | |
|
2 | ||||
|
3 | This uses the ETS 4.0 selection pattern of: | |||
|
4 | PySide first, PyQt with API v2. second. | |||
|
5 | ||||
|
6 | Do not use this if you need PyQt with the old QString/QVariant API. | |||
2 | """ |
|
7 | """ | |
3 |
|
8 | |||
4 | import os |
|
9 | import os |
@@ -1,12 +1,75 b'' | |||||
1 | """ Import Qt in a manner suitable for an IPython kernel. |
|
1 | """ Import Qt in a manner suitable for an IPython kernel. | |
|
2 | ||||
|
3 | This is the import used for the `gui=qt` or `pylab=qt` initialization. | |||
|
4 | ||||
|
5 | Priority: | |||
|
6 | ||||
|
7 | if matplotlib has been imported: | |||
|
8 | # get here with pylab=qt | |||
|
9 | if matplotlib doesn't support v2 (<= 1.0.1): | |||
|
10 | use PyQt4 @v1 | |||
|
11 | else: | |||
|
12 | ask matplotlib which Qt it's using | |||
|
13 | if it said PyQt: | |||
|
14 | use PyQt4 @v1 | |||
|
15 | elif it said PySide: | |||
|
16 | use PySide | |||
|
17 | ||||
|
18 | if matplotlib had nothing to say, or matplotlib not imported: | |||
|
19 | # get here with gui=qt, or if matplotlib didn't tell us anything | |||
|
20 | ask ETS' QT_API env variable | |||
|
21 | ||||
|
22 | if QT_API not set: | |||
|
23 | # this is the *default* path - no information was given | |||
|
24 | try: | |||
|
25 | PyQt @v1 | |||
|
26 | except: | |||
|
27 | fallback on PySide | |||
|
28 | else: | |||
|
29 | use PyQt @v2 or PySide, depending on QT_API | |||
|
30 | because ETS doesn't work with v1. | |||
2 | """ |
|
31 | """ | |
3 |
|
32 | |||
|
33 | import os | |||
4 | import sys |
|
34 | import sys | |
5 |
|
35 | |||
6 | # Older versions of matplotlib do not support PyQt4 v2 APIs or PySide, so we |
|
|||
7 | # cannot go through the preferred mechanism. |
|
|||
8 | matplotlib = sys.modules.get('matplotlib') |
|
36 | matplotlib = sys.modules.get('matplotlib') | |
9 | if matplotlib and matplotlib.__version__ <= '1.0.1': |
|
37 | if matplotlib: | |
|
38 | # ask matplotlib first (get here with pylab=qt) | |||
|
39 | if matplotlib.__version__ <= '1.0.1': | |||
|
40 | # 1.0.1 doesn't support pyside or v2, so force PyQt @v1 | |||
|
41 | mod = 'PyQt4' | |||
|
42 | else: | |||
|
43 | # this rc option has been proposed, but is yet not in matplotlib master | |||
|
44 | # as of writing. | |||
|
45 | mod = matplotlib.rcParams.get('backend.qt4', None) | |||
|
46 | else: | |||
|
47 | # get here with `gui=qt` | |||
|
48 | mod = None | |||
|
49 | ||||
|
50 | if mod is None: | |||
|
51 | # matplotlib not imported or had nothing to say. | |||
|
52 | # ask QT_API ETS variable | |||
|
53 | QT_API = os.environ.get('QT_API', None) | |||
|
54 | if QT_API is None: | |||
|
55 | try: | |||
|
56 | # default to unconfigured PyQt4 | |||
|
57 | from PyQt4 import QtCore, QtGui | |||
|
58 | except ImportError: | |||
|
59 | # fallback on PySide | |||
|
60 | try: | |||
|
61 | from PySide import QtCore, QtGui | |||
|
62 | except ImportError: | |||
|
63 | raise ImportError('Cannot import PySide or PyQt4') | |||
|
64 | else: | |||
|
65 | # QT_API specified, use PySide or PyQt+v2 API from external.qt | |||
|
66 | # this means ETS is likely to be used, which requires v2 | |||
|
67 | from IPython.external.qt import QtCore, QtGui | |||
|
68 | ||||
|
69 | elif mod.lower() == 'pyqt4': | |||
|
70 | # import PyQt4 unconfigured | |||
10 | from PyQt4 import QtCore, QtGui |
|
71 | from PyQt4 import QtCore, QtGui | |
|
72 | elif mod.lower() == 'pyside': | |||
|
73 | from PySide import QtCore, QtGui | |||
11 | else: |
|
74 | else: | |
12 | from IPython.external.qt import QtCore, QtGui |
|
75 | raise ImportError("unhandled value for backend.qt4 from matplotlib: %r"%mod) No newline at end of file |
@@ -1256,6 +1256,46 b' process pending events at critical points.' | |||||
1256 | Finally, we also have a number of examples in our source directory |
|
1256 | Finally, we also have a number of examples in our source directory | |
1257 | :file:`docs/examples/lib` that demonstrate these capabilities. |
|
1257 | :file:`docs/examples/lib` that demonstrate these capabilities. | |
1258 |
|
1258 | |||
|
1259 | PyQt and PySide | |||
|
1260 | --------------- | |||
|
1261 | ||||
|
1262 | .. attempt at explanation of the complete mess that is Qt support | |||
|
1263 | ||||
|
1264 | When you use ``gui=qt`` or ``pylab=qt``, IPython can work with either | |||
|
1265 | PyQt4 or PySide. There are three options for configuration here, because | |||
|
1266 | PyQt4 has two APIs for QString and QVariant - v1, which is the default on | |||
|
1267 | Python 2, and the more natural v2, which is the only API supported by PySide. | |||
|
1268 | v2 is also the default for PyQt4 on Python 3. IPython's code for the QtConsole | |||
|
1269 | uses v2, but you can still use any interface in your code, since the | |||
|
1270 | Qt frontend is in a different process. | |||
|
1271 | ||||
|
1272 | If you launch IPython in pylab mode with ``ipython pylab=qt``, then IPython | |||
|
1273 | will ask matplotlib which Qt library to use, via the 'backend.qt4' rcParam. | |||
|
1274 | If matplotlib is version 1.0.1 or older, then IPython will always use PyQt4 | |||
|
1275 | without setting the v2 APIs. | |||
|
1276 | ||||
|
1277 | If you just integrate the Qt event loop with ``ipython gui=qt``, then IPython | |||
|
1278 | has a few more possibilities. The default will be to import PyQt4 without | |||
|
1279 | configuration of the APIs, thus matching what most applications would expect. | |||
|
1280 | It will fall back of PySide if PyQt4 is unavailable. | |||
|
1281 | ||||
|
1282 | If specified, IPython will respect the environment variable ``QT_API`` used | |||
|
1283 | by ETS. ETS 4.0 also works with both PyQt4 and PySide, but it requires | |||
|
1284 | PyQt4 to use the v2 API. So if ``QT_API=pyside`` PySide will be used, | |||
|
1285 | and if ``QT_API=pyqt`` then PyQt4 will be used with the v2 API for | |||
|
1286 | QString and QVariant, so ETS codes like MayaVi will also work with IPython. | |||
|
1287 | ||||
|
1288 | .. warning:: | |||
|
1289 | ||||
|
1290 | Note that this means for ETS to work with PyQt4, ``QT_API`` *must* be set to | |||
|
1291 | work with IPython's qt integration, because otherwise PyQt4 will be loaded in | |||
|
1292 | an incompatible mode. | |||
|
1293 | ||||
|
1294 | It also means that you must not have ``QT_API`` set if you want to | |||
|
1295 | use ``gui=qt`` with code that requires PyQt4 API v1. | |||
|
1296 | ||||
|
1297 | ||||
|
1298 | ||||
1259 | .. _matplotlib_support: |
|
1299 | .. _matplotlib_support: | |
1260 |
|
1300 | |||
1261 | Plotting with matplotlib |
|
1301 | Plotting with matplotlib |
General Comments 0
You need to be logged in to leave comments.
Login now