22"""
33
44import os
5+ import warnings
6+ from matplotlib import rcParams
57
68# Available APIs.
7- QT_API_PYQT = 'pyqt'
8- QT_API_PYSIDE = 'pyside'
9+ QT_API_PYQT = 'PyQt4' # API is not set here; Python 2.x default is V 1
10+ QT_API_PYQTv2 = 'PyQt4v2' # forced to Version 2 API
11+ QT_API_PYSIDE = 'PySide' # only supports Version 2 API
912
10- # Select PyQt4 or PySide using an environment variable, in the same way IPython does.
11- # IPython is using PyQt as default (for now) so we will too.
12- QT_API = os .environ .get ('QT_API' , QT_API_PYQT )
13+ ETS = dict (pyqt = QT_API_PYQTv2 , pyside = QT_API_PYSIDE )
1314
14- if QT_API == QT_API_PYQT :
15+ # If the ETS QT_API environment variable is set, use it. Note that
16+ # ETS requires the version 2 of PyQt4, which is not the platform
17+ # default for Python 2.x.
18+
19+ QT_API_ENV = os .environ .get ('QT_API' )
20+ if QT_API_ENV is not None :
1521 try :
16- from PyQt4 import QtCore , QtGui
17- except ImportError :
18- raise ImportError ("Qt4 backend requires that PyQt4 is installed." )
22+ QT_API = ETS [QT_API_ENV ]
23+ except KeyError :
24+ raise RuntimeError (
25+ 'Unrecognized environment variable %r, valid values are: %r or %r' %
26+ (QT_API_ENV , 'pyqt' , 'pyside' ))
27+ else :
28+ # No ETS environment, so use rcParams.
29+ QT_API = rcParams ['backend.qt4' ]
30+
31+ # We will define an appropriate wrapper for the differing versions
32+ # of file dialog.
33+ _getSaveFileName = None
34+
35+ # Now perform the imports.
36+ if QT_API in (QT_API_PYQT , QT_API_PYQTv2 ):
37+ import sip
38+ if QT_API == QT_API_PYQTv2 :
39+ sip .setapi ('QString' , 2 )
40+ sip .setapi ('QVariant' , 2 )
41+
42+ from PyQt4 import QtCore , QtGui
43+
1944 # Alias PyQt-specific functions for PySide compatibility.
45+ QtCore .Signal = QtCore .pyqtSignal
2046 try :
2147 QtCore .Slot = QtCore .pyqtSlot
2248 except AttributeError :
23- QtCore .Slot = pyqtSignature # Not a perfect match but
49+ QtCore .Slot = pyqtSignature # Not a perfect match but
2450 # works in simple cases
2551 QtCore .Property = QtCore .pyqtProperty
2652 __version__ = QtCore .PYQT_VERSION_STR
27- import sip
53+
2854 try :
2955 if sip .getapi ("QString" ) > 1 :
3056 # Use new getSaveFileNameAndFilter()
31- _getSaveFileName = lambda self , msg , start , filters , \
32- selectedFilter : \
33- QtGui .QFileDialog .getSaveFileNameAndFilter ( \
34- self , msg , start , filters , selectedFilter )[0 ]
57+ _get_save = QtGui .QFileDialog .getSaveFileNameAndFilter
3558 else :
3659 # Use old getSaveFileName()
3760 _getSaveFileName = QtGui .QFileDialog .getSaveFileName
3861 except (AttributeError , KeyError ) :
3962 # call to getapi() can fail in older versions of sip
40- # Use the old getSaveFileName()
4163 _getSaveFileName = QtGui .QFileDialog .getSaveFileName
4264
43- elif QT_API == QT_API_PYSIDE :
44- try :
45- from PySide import QtCore , QtGui , __version__ , __version_info__
46- except ImportError :
47- raise ImportError ("Qt4 backend requires that PySide is installed." )
65+ else : # can only be pyside
66+ from PySide import QtCore , QtGui , __version__ , __version_info__
4867 if __version_info__ < (1 ,0 ,3 ):
49- raise ImportError ("Matplotlib backend_qt4 and backend_qt4agg require PySide >=1.0.3" )
68+ raise ImportError (
69+ "Matplotlib backend_qt4 and backend_qt4agg require PySide >=1.0.3" )
5070
51- # Alias PySide-specific function for PyQt compatibilty
52- QtCore .pyqtProperty = QtCore .Property
53- QtCore .pyqtSignature = QtCore .Slot # Not a perfect match but
54- # works in simple cases
71+ _get_save = QtGui .QFileDialog .getSaveFileName
72+
73+
74+ if _getSaveFileName is None :
75+
76+ def _getSaveFileName (self , msg , start , filters , selectedFilter ):
77+ return _get_save (self , msg , start , filters , selectedFilter )[0 ]
5578
56- _getSaveFileName = lambda self , msg , start , filters , selectedFilter : \
57- QtGui .QFileDialog .getSaveFileName (self , \
58- msg , start , filters , selectedFilter )[0 ]
59- else :
60- raise RuntimeError ('Invalid Qt API %r, valid values are: %r or %r' %
61- (QT_API , QT_API_PYQT , QT_API_PYSIDE ))
0 commit comments