From 5a5a1683b692743100ddcc90dcef525ff63e008c Mon Sep 17 00:00:00 2001 From: Stephan Rave Date: Thu, 27 Apr 2017 09:39:04 +0200 Subject: [PATCH] [gui] use Py.Qt shim --- dependencies.py | 2 +- src/pymor/core/config.py | 18 ++++++++---------- src/pymor/core/exceptions.py | 6 +++--- src/pymor/gui/gl.py | 7 ++++--- src/pymor/gui/matplotlib.py | 4 ++-- src/pymor/gui/qt.py | 22 +++++++++++----------- src/pymordemos/thermalblock_gui.py | 6 +++--- src/pymortests/demos.py | 6 +++--- src/pymortests/grid.py | 6 +++--- src/pymortests/gui.py | 6 +++--- 10 files changed, 41 insertions(+), 42 deletions(-) diff --git a/dependencies.py b/dependencies.py index fedc043d6a..eed16f09ca 100755 --- a/dependencies.py +++ b/dependencies.py @@ -4,7 +4,7 @@ # License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) tests_require = ['pytest', 'pytest-cov'] -install_requires = ['cython>=0.20.1', 'numpy>=1.8.1', 'scipy>=0.13.3', 'Sphinx>=1.4.0', 'docopt'] +install_requires = ['cython>=0.20.1', 'numpy>=1.8.1', 'scipy>=0.13.3', 'Sphinx>=1.4.0', 'docopt', 'Qt.py'] setup_requires = ['pytest-runner', 'cython>=0.20.1', 'numpy>=1.8.1'] install_suggests = {'ipython>=3.0': 'an enhanced interactive python shell', 'ipyparallel': 'required for pymor.parallel.ipython', diff --git a/src/pymor/core/config.py b/src/pymor/core/config.py index 590bc12b41..285bb94dd8 100644 --- a/src/pymor/core/config.py +++ b/src/pymor/core/config.py @@ -15,13 +15,6 @@ def _get_fenics_version(): return version -def _get_matplotlib_version(): - import matplotlib - # matplotlib's default is to use PyQt for Qt4 bindings. However, we use PySide .. - matplotlib.rcParams['backend.qt4'] = 'PySide' - return matplotlib.__version__ - - def _get_ipython_version(): try: import ipyparallel @@ -31,6 +24,11 @@ def _get_ipython_version(): return getattr(IPython.parallel, '__version__', True) +def _get_qt_version(): + import Qt + return Qt.__binding__ + ' ' + Qt.__binding_version__ + + _PACKAGES = { 'CYTHON': lambda: import_module('cython').__version__, 'DEALII': lambda: import_module('pydealii'), @@ -38,14 +36,14 @@ def _get_ipython_version(): 'FENICS': _get_fenics_version, 'GL': lambda: import_module('OpenGL.GL') and import_module('OpenGL').__version__, 'IPYTHON': _get_ipython_version, - 'MATPLOTLIB': _get_matplotlib_version, + 'MATPLOTLIB': lambda: import_module('matplotlib').__version__, 'MPI': lambda: import_module('mpi4py.MPI') and import_module('mpi4py').__version__, 'NUMPY': lambda: import_module('numpy').__version__, 'PYAMG': lambda: import_module('pyamg.version').full_version, - 'PYSIDE': lambda: import_module('PySide.QtGui') and import_module('PySide.QtCore').__version__, 'PYTEST': lambda: import_module('pytest').__version__, 'PYVTK': lambda: bool(import_module('evtk')), - 'QTOPENGL': lambda: bool(import_module('PySide.QtOpenGL')), + 'QT': _get_qt_version, + 'QTOPENGL': lambda: bool(import_module('Qt.QtOpenGL')), 'SCIPY': lambda: import_module('scipy').__version__, 'SCIPY_LSMR': lambda: hasattr(import_module('scipy.sparse.linalg'), 'lsmr'), 'SPHINX': lambda: import_module('sphinx').__version__, diff --git a/src/pymor/core/exceptions.py b/src/pymor/core/exceptions.py index b3adbd4400..381b83c5d1 100644 --- a/src/pymor/core/exceptions.py +++ b/src/pymor/core/exceptions.py @@ -49,8 +49,8 @@ def __init__(self, op): self.op = op -class PySideMissing(ImportError): - """Raise me where having importable PySide is non-optional""" +class QtMissing(ImportError): + """Raise me where having importable Qt bindings is non-optional""" def __init__(self, msg=None): - msg = msg or 'cannot visualize: import of PySide failed' + msg = msg or 'cannot visualize: import of Qt bindings failed' super().__init__(msg) diff --git a/src/pymor/gui/gl.py b/src/pymor/gui/gl.py index f2c3a7377d..01207faa10 100644 --- a/src/pymor/gui/gl.py +++ b/src/pymor/gui/gl.py @@ -16,10 +16,11 @@ from pymor.core.config import config -if config.HAVE_PYSIDE and config.HAVE_QTOPENGL and config.HAVE_GL: +if config.HAVE_QT and config.HAVE_QTOPENGL and config.HAVE_GL: import OpenGL.GL as gl - from PySide.QtGui import QSizePolicy, QPainter, QFontMetrics - from PySide.QtOpenGL import QGLWidget + from Qt.QtWidgets import QSizePolicy + from Qt.QtGui import QPainter, QFontMetrics + from Qt.QtOpenGL import QGLWidget from ctypes import c_void_p from pymor.grids.constructions import flatten_grid diff --git a/src/pymor/gui/matplotlib.py b/src/pymor/gui/matplotlib.py index a7bca1029f..847360d559 100644 --- a/src/pymor/gui/matplotlib.py +++ b/src/pymor/gui/matplotlib.py @@ -14,8 +14,8 @@ from pymor.core.config import config -if config.HAVE_PYSIDE and config.HAVE_MATPLOTLIB: - from PySide.QtGui import QSizePolicy +if config.HAVE_QT and config.HAVE_MATPLOTLIB: + from Qt.QtWidgets import QSizePolicy from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas diff --git a/src/pymor/gui/qt.py b/src/pymor/gui/qt.py index ee1689f2a9..302aecb06a 100644 --- a/src/pymor/gui/qt.py +++ b/src/pymor/gui/qt.py @@ -3,8 +3,8 @@ # License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) """ This module provides a few methods and classes for visualizing data -associated to grids. We use the `PySide `_ bindings -for the `Qt `_ widget toolkit for the GUI. +associated to grids. We use the the `Qt `_ widget +toolkit for the GUI. """ import math as m @@ -20,7 +20,7 @@ from pymor.core.defaults import defaults from pymor.core.interfaces import BasicInterface from pymor.core.logger import getLogger -from pymor.core.exceptions import PySideMissing +from pymor.core.exceptions import QtMissing from pymor.grids.oned import OnedGrid from pymor.grids.referenceelements import triangle, square from pymor.gui.gl import GLPatchWidget, ColorBarWidget @@ -29,10 +29,10 @@ from pymor.vectorarrays.interfaces import VectorArrayInterface from pymor.vectorarrays.numpy import NumpyVectorArray, NumpyVectorSpace -if config.HAVE_PYSIDE: - from PySide.QtGui import (QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QSlider, QApplication, QLCDNumber, +if config.HAVE_QT: + from Qt.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QSlider, QApplication, QLCDNumber, QAction, QStyle, QToolBar, QLabel, QFileDialog, QMessageBox) - from PySide.QtCore import Qt, QCoreApplication, QTimer + from Qt.QtCore import Qt, QCoreApplication, QTimer class PlotMainWindow(QWidget): """Base class for plot main windows.""" @@ -245,8 +245,8 @@ def visualize_patch(grid, U, bounding_box=([0, 0], [1, 1]), codim=2, title=None, The number of columns in the visualizer GUI in case multiple plots are displayed at the same time. """ - if not config.HAVE_PYSIDE: - raise PySideMissing() + if not config.HAVE_QT: + raise QtMissing() assert backend in {'gl', 'matplotlib'} @@ -257,7 +257,7 @@ def visualize_patch(grid, U, bounding_box=([0, 0], [1, 1]), codim=2, title=None, backend = 'matplotlib' elif not config.HAVE_QTOPENGL: logger = getLogger('pymor.gui.qt.visualize_patch') - logger.warn('import of PySide.QtOpenGL failed, falling back to matplotlib; rendering will be slow') + logger.warn('import of Qt.QtOpenGL failed, falling back to matplotlib; rendering will be slow') backend = 'matplotlib' if backend == 'matplotlib' and not config.HAVE_MATPLOTLIB: raise ImportError('cannot visualize: import of matplotlib failed') @@ -412,8 +412,8 @@ def visualize_matplotlib_1d(grid, U, codim=1, title=None, legend=None, separate_ block If `True`, block execution until the plot window is closed. """ - if not config.HAVE_PYSIDE: - raise PySideMissing() + if not config.HAVE_QT: + raise QtMissing() if not config.HAVE_MATPLOTLIB: raise ImportError('cannot visualize: import of matplotlib failed') diff --git a/src/pymordemos/thermalblock_gui.py b/src/pymordemos/thermalblock_gui.py index b58d2013be..a130a74f1f 100755 --- a/src/pymordemos/thermalblock_gui.py +++ b/src/pymordemos/thermalblock_gui.py @@ -41,11 +41,11 @@ OpenGL.ERROR_ON_COPY = True -from pymor.core.exceptions import PySideMissing +from pymor.core.exceptions import QtMissing try: - from PySide import QtGui + from Qt import QtGui except ImportError as e: - raise PySideMissing() + raise QtMissing() from pymor.algorithms.basisextension import gram_schmidt_basis_extension from pymor.algorithms.greedy import greedy from pymor.analyticalproblems.thermalblock import thermal_block_problem diff --git a/src/pymortests/demos.py b/src/pymortests/demos.py index 532d7687f7..8be98b7829 100644 --- a/src/pymortests/demos.py +++ b/src/pymortests/demos.py @@ -11,7 +11,7 @@ import shutil from pymortests.base import runmodule, check_results -from pymor.core.exceptions import PySideMissing +from pymor.core.exceptions import QtMissing from pymor.gui.qt import stop_gui_processes @@ -125,8 +125,8 @@ def nop(*args, **kwargs): result = None try: result = demo() - except PySideMissing: - pytest.xfail("PySide missing") + except QtMissing: + pytest.xfail("Qt missing") finally: stop_gui_processes() from pymor.parallel.default import _cleanup diff --git a/src/pymortests/grid.py b/src/pymortests/grid.py index 9c61af8dd8..f9f8a82fa5 100644 --- a/src/pymortests/grid.py +++ b/src/pymortests/grid.py @@ -8,7 +8,7 @@ import numpy as np import pytest -from pymor.core.exceptions import PySideMissing +from pymor.core.exceptions import QtMissing from pymor.gui.qt import stop_gui_processes from pymortests.fixtures.grid import grid, grids_with_visualize from pymortests.pickling import assert_picklable_without_dumps_function @@ -446,7 +446,7 @@ def nop(*args, **kwargs): g = grids_with_visualize U = np.ones(g.size(g.dim)) g.visualize(U, g.dim) - except PySideMissing: - pytest.xfail("PySide missing") + except QtMissing: + pytest.xfail("Qt missing") finally: stop_gui_processes() diff --git a/src/pymortests/gui.py b/src/pymortests/gui.py index d13b3cf682..0d06bab226 100644 --- a/src/pymortests/gui.py +++ b/src/pymortests/gui.py @@ -12,7 +12,7 @@ from pymor.discretizers.cg import discretize_stationary_cg from pymor.domaindiscretizers.default import discretize_domain_default from pymor.grids.rect import RectGrid -from pymor.core.exceptions import PySideMissing +from pymor.core.exceptions import QtMissing from pymortests.base import runmodule from pymor.domaindescriptions.basic import RectDomain, LineDomain @@ -37,8 +37,8 @@ def test_visualize_patch(backend_gridtype): U = discretization.solve() try: visualize_patch(data['grid'], U=U, backend=backend) - except PySideMissing as ie: - pytest.xfail("PySide missing") + except QtMissing as ie: + pytest.xfail("Qt missing") finally: stop_gui_processes()