mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-03 14:53:30 +08:00
Update viewer for PyQt5 compatibility
Conflicts: skimage/viewer/tests/test_plugins.py skimage/viewer/tests/test_tools.py
This commit is contained in:
+7
-1
@@ -60,7 +60,13 @@ import os.path as _osp
|
||||
import imp as _imp
|
||||
import functools as _functools
|
||||
import warnings as _warnings
|
||||
from skimage._shared.utils import deprecated as _deprecated
|
||||
|
||||
import matplotlib as _mpl
|
||||
try:
|
||||
_imp.find_module('PyQt5')
|
||||
_mpl.use('Qt5Agg')
|
||||
except ImportError:
|
||||
_mpl.use('Qt4Agg')
|
||||
|
||||
pkg_dir = _osp.abspath(_osp.dirname(__file__))
|
||||
data_dir = _osp.join(pkg_dir, 'data')
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
from warnings import warn
|
||||
from skimage._shared.version_requirements import is_installed
|
||||
try:
|
||||
from .qt import QtGui as _QtGui
|
||||
except ImportError as e:
|
||||
raise
|
||||
raise ImportError('Viewer requires Qt')
|
||||
|
||||
from .viewers import ImageViewer, CollectionViewer
|
||||
from .qt import qt_api
|
||||
|
||||
viewer_available = not qt_api is None and is_installed('matplotlib')
|
||||
if not viewer_available:
|
||||
warn('Viewer requires matplotlib and Qt')
|
||||
|
||||
del qt_api, is_installed, warn
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import numpy as np
|
||||
try:
|
||||
from matplotlib import lines
|
||||
except ImportError:
|
||||
pass
|
||||
from matplotlib import lines
|
||||
|
||||
__all__ = ['CanvasToolBase', 'ToolHandles']
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
import numpy as np
|
||||
|
||||
try:
|
||||
from matplotlib import lines
|
||||
except ImportError:
|
||||
pass
|
||||
from matplotlib import lines
|
||||
from skimage.viewer.canvastools.base import CanvasToolBase, ToolHandles
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import numpy as np
|
||||
try:
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.colors as mcolors
|
||||
LABELS_CMAP = mcolors.ListedColormap(['white', 'red', 'dodgerblue', 'gold',
|
||||
'greenyellow', 'blueviolet'])
|
||||
except ImportError:
|
||||
pass
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.colors as mcolors
|
||||
LABELS_CMAP = mcolors.ListedColormap(['white', 'red', 'dodgerblue', 'gold',
|
||||
'greenyellow', 'blueviolet'])
|
||||
from skimage.viewer.canvastools.base import CanvasToolBase
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
try:
|
||||
from matplotlib.widgets import RectangleSelector
|
||||
except ImportError:
|
||||
RectangleSelector = object
|
||||
|
||||
from matplotlib.widgets import RectangleSelector
|
||||
from skimage.viewer.canvastools.base import CanvasToolBase
|
||||
from skimage.viewer.canvastools.base import ToolHandles
|
||||
|
||||
|
||||
@@ -4,19 +4,11 @@ Base class for Plugins that interact with ImageViewer.
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..qt import QtGui, qt_api
|
||||
from ..qt.QtCore import Qt, Signal
|
||||
from ..qt import QtWidgets, QtCore, Signal
|
||||
from ..utils import RequiredAttr, init_qtapp
|
||||
from skimage._shared.testing import doctest_skip_parser
|
||||
|
||||
if qt_api is not None:
|
||||
has_qt = True
|
||||
else:
|
||||
has_qt = False
|
||||
|
||||
|
||||
class Plugin(QtGui.QDialog):
|
||||
class Plugin(QtWidgets.QDialog):
|
||||
"""Base class for plugins that interact with an ImageViewer.
|
||||
|
||||
A plugin connects an image filter (or another function) to an image viewer.
|
||||
@@ -101,7 +93,7 @@ class Plugin(QtGui.QDialog):
|
||||
"then the `image_filter` argument is ignored.")
|
||||
|
||||
self.setWindowTitle(self.name)
|
||||
self.layout = QtGui.QGridLayout(self)
|
||||
self.layout = QtWidgets.QGridLayout(self)
|
||||
self.resize(width, height)
|
||||
self.row = 0
|
||||
|
||||
@@ -124,7 +116,7 @@ class Plugin(QtGui.QDialog):
|
||||
the image matches the filtered value specified by attached widgets.
|
||||
"""
|
||||
self.setParent(image_viewer)
|
||||
self.setWindowFlags(Qt.Dialog)
|
||||
self.setWindowFlags(QtCore.Qt.Dialog)
|
||||
|
||||
self.image_viewer = image_viewer
|
||||
self.image_viewer.plugins.append(self)
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import numpy as np
|
||||
try:
|
||||
import matplotlib.pyplot as plt
|
||||
except ImportError:
|
||||
pass
|
||||
import matplotlib.pyplot as plt
|
||||
from skimage import color
|
||||
from skimage import exposure
|
||||
from .plotplugin import PlotPlugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import numpy as np
|
||||
from ..qt import QtGui
|
||||
|
||||
from ..qt import QtGui
|
||||
from ..utils import new_plot
|
||||
from .base import Plugin
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
try:
|
||||
from matplotlib.backends.qt_compat import QtGui, QtCore, QtWidgets
|
||||
except ImportError:
|
||||
from matplotlib.backends.qt4_compat import QtGui, QtCore
|
||||
QtWidgets = QtGui
|
||||
|
||||
Qt = QtCore.Qt
|
||||
Signal = QtCore.Signal
|
||||
@@ -1,22 +0,0 @@
|
||||
from . import qt_api
|
||||
|
||||
if qt_api == 'pyside':
|
||||
from PySide.QtCore import *
|
||||
elif qt_api == 'pyqt':
|
||||
from PyQt4.QtCore import *
|
||||
# Use pyside names for signals and slots
|
||||
Signal = pyqtSignal
|
||||
Slot = pyqtSlot
|
||||
else:
|
||||
# Mock objects for buildbot (which doesn't have Qt, but imports viewer).
|
||||
class Qt(object):
|
||||
TopDockWidgetArea = None
|
||||
BottomDockWidgetArea = None
|
||||
LeftDockWidgetArea = None
|
||||
RightDockWidgetArea = None
|
||||
|
||||
def Signal(*args, **kwargs):
|
||||
pass
|
||||
|
||||
def Slot(*args, **kwargs):
|
||||
pass
|
||||
@@ -1,11 +0,0 @@
|
||||
from . import qt_api
|
||||
|
||||
if qt_api == 'pyside':
|
||||
from PySide.QtGui import *
|
||||
elif qt_api == 'pyqt':
|
||||
from PyQt4.QtGui import *
|
||||
else:
|
||||
# Mock objects
|
||||
QMainWindow = object
|
||||
QDialog = object
|
||||
QWidget = object
|
||||
@@ -1,5 +0,0 @@
|
||||
This qt subpackage provides a wrapper to allow use of either PySide or PyQt4.
|
||||
In addition, if neither package is available, some mock objects are created to
|
||||
prevent errors in the TravisCI build. Only the objects used in the global
|
||||
namespace need to be mocked (e.g., a Qt object that gets subclassed is used
|
||||
in the global namespace).
|
||||
@@ -1,22 +0,0 @@
|
||||
import os
|
||||
import warnings
|
||||
|
||||
qt_api = os.environ.get('QT_API')
|
||||
|
||||
if qt_api is None:
|
||||
try:
|
||||
import PyQt4
|
||||
qt_api = 'pyqt'
|
||||
except ImportError:
|
||||
try:
|
||||
import PySide
|
||||
qt_api = 'pyside'
|
||||
except ImportError:
|
||||
qt_api = None
|
||||
# Note that we don't want to raise an error because that would
|
||||
# cause the TravisCI build to fail.
|
||||
warnings.warn("Could not import PyQt4: ImageViewer not available!")
|
||||
|
||||
|
||||
if qt_api is not None:
|
||||
os.environ['QT_API'] = qt_api
|
||||
@@ -4,15 +4,26 @@ import skimage
|
||||
import skimage.data as data
|
||||
from skimage.filters.rank import median
|
||||
from skimage.morphology import disk
|
||||
from skimage.viewer import ImageViewer, viewer_available
|
||||
try:
|
||||
from skimage.viewer import ImageViewer
|
||||
from skimage.viewer.plugins.base import Plugin
|
||||
from skimage.viewer.widgets import Slider
|
||||
from skimage.viewer.plugins import (
|
||||
LineProfile, Measure, CannyPlugin, LabelPainter, Crop, ColorHistogram,
|
||||
PlotPlugin)
|
||||
except ImportError:
|
||||
ImageViewer is None
|
||||
from numpy.testing import assert_equal, assert_allclose, assert_almost_equal
|
||||
from numpy.testing.decorators import skipif
|
||||
<<<<<<< HEAD
|
||||
from skimage.viewer.plugins import (
|
||||
LineProfile, Measure, CannyPlugin, LabelPainter, Crop, ColorHistogram,
|
||||
PlotPlugin)
|
||||
from skimage.viewer.plugins.base import Plugin
|
||||
from skimage.viewer.widgets import Slider
|
||||
from skimage._shared._warnings import expected_warnings
|
||||
=======
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
|
||||
|
||||
def setup_line_profile(image, limits='image'):
|
||||
@@ -22,7 +33,7 @@ def setup_line_profile(image, limits='image'):
|
||||
return plugin
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_line_profile():
|
||||
""" Test a line profile using an ndim=2 image"""
|
||||
plugin = setup_line_profile(data.camera())
|
||||
@@ -36,7 +47,7 @@ def test_line_profile():
|
||||
assert_allclose(scan_data.mean(), 0.2812, rtol=1e-3)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_line_profile_rgb():
|
||||
""" Test a line profile using an ndim=3 image"""
|
||||
plugin = setup_line_profile(data.chelsea(), limits=None)
|
||||
@@ -51,7 +62,7 @@ def test_line_profile_rgb():
|
||||
assert_allclose(scan_data.mean(), 0.4359, rtol=1e-3)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_line_profile_dynamic():
|
||||
"""Test a line profile updating after an image transform"""
|
||||
image = data.coins()[:-50, :] # shave some off to make the line lower
|
||||
@@ -77,7 +88,7 @@ def test_line_profile_dynamic():
|
||||
assert_almost_equal(np.max(line) - np.min(line), 0.639, 1)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_measure():
|
||||
image = data.camera()
|
||||
viewer = ImageViewer(image)
|
||||
@@ -89,7 +100,7 @@ def test_measure():
|
||||
assert_equal(str(m._angle.text[:5]), '135.0')
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_canny():
|
||||
image = data.camera()
|
||||
viewer = ImageViewer(image)
|
||||
@@ -102,7 +113,7 @@ def test_canny():
|
||||
assert edges.sum() == 2852
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_label_painter():
|
||||
image = data.camera()
|
||||
moon = data.moon()
|
||||
@@ -120,7 +131,7 @@ def test_label_painter():
|
||||
assert_equal(lp.paint_tool.shape, moon.shape)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_crop():
|
||||
image = data.camera()
|
||||
viewer = ImageViewer(image)
|
||||
@@ -131,7 +142,7 @@ def test_crop():
|
||||
assert_equal(viewer.image.shape, (101, 101))
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_color_histogram():
|
||||
image = skimage.img_as_float(data.load('color.png'))
|
||||
viewer = ImageViewer(image)
|
||||
@@ -143,7 +154,7 @@ def test_color_histogram():
|
||||
assert_almost_equal(viewer.image.std(), 0.325, 3)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_plot_plugin():
|
||||
viewer = ImageViewer(data.moon())
|
||||
plugin = PlotPlugin(image_filter=lambda x: x)
|
||||
@@ -155,7 +166,7 @@ def test_plot_plugin():
|
||||
viewer.close()
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_plugin():
|
||||
img = skimage.img_as_float(data.moon())
|
||||
viewer = ImageViewer(img)
|
||||
|
||||
@@ -4,12 +4,22 @@ import numpy as np
|
||||
from numpy.testing import assert_equal
|
||||
from numpy.testing.decorators import skipif
|
||||
from skimage import data
|
||||
<<<<<<< HEAD
|
||||
from skimage.viewer import ImageViewer, viewer_available
|
||||
from skimage.viewer.canvastools import (
|
||||
LineTool, ThickLineTool, RectangleTool, PaintTool)
|
||||
from skimage.viewer.canvastools.base import CanvasToolBase
|
||||
from matplotlib.testing.decorators import cleanup
|
||||
|
||||
=======
|
||||
try:
|
||||
from skimage.viewer import ImageViewer
|
||||
from skimage.viewer.canvastools import (
|
||||
LineTool, ThickLineTool, RectangleTool, PaintTool)
|
||||
from skimage.viewer.canvastools.base import CanvasToolBase
|
||||
except ImportError:
|
||||
ImageViewer = None
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
|
||||
|
||||
def get_end_points(image):
|
||||
@@ -74,8 +84,12 @@ def do_event(viewer, etype, button=1, xdata=0, ydata=0, key=None):
|
||||
func(event)
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
@cleanup
|
||||
@skipif(not viewer_available)
|
||||
=======
|
||||
@skipif(ImageViewer is None)
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
def test_line_tool():
|
||||
img = data.camera()
|
||||
viewer = ImageViewer(img)
|
||||
@@ -100,8 +114,12 @@ def test_line_tool():
|
||||
assert_equal(tool.geometry, np.array([[100, 100], [10, 10]]))
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
@cleanup
|
||||
@skipif(not viewer_available)
|
||||
=======
|
||||
@skipif(ImageViewer is None)
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
def test_thick_line_tool():
|
||||
img = data.camera()
|
||||
viewer = ImageViewer(img)
|
||||
@@ -124,8 +142,12 @@ def test_thick_line_tool():
|
||||
assert_equal(tool.linewidth, 1)
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
@cleanup
|
||||
@skipif(not viewer_available)
|
||||
=======
|
||||
@skipif(ImageViewer is None)
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
def test_rect_tool():
|
||||
img = data.camera()
|
||||
viewer = ImageViewer(img)
|
||||
@@ -153,8 +175,12 @@ def test_rect_tool():
|
||||
assert_equal(tool.geometry, [10, 100, 10, 100])
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
@cleanup
|
||||
@skipif(not viewer_available)
|
||||
=======
|
||||
@skipif(ImageViewer is None)
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
def test_paint_tool():
|
||||
img = data.moon()
|
||||
viewer = ImageViewer(img)
|
||||
@@ -187,8 +213,12 @@ def test_paint_tool():
|
||||
assert_equal(tool.overlay.sum(), 0)
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
@cleanup
|
||||
@skipif(not viewer_available)
|
||||
=======
|
||||
@skipif(ImageViewer is None)
|
||||
>>>>>>> 7e2fdf7... Update viewer for PyQt5 compatibility
|
||||
def test_base_tool():
|
||||
img = data.moon()
|
||||
viewer = ImageViewer(img)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from skimage.viewer import viewer_available
|
||||
from skimage.viewer.qt import QtCore, QtGui
|
||||
from skimage.viewer import utils
|
||||
from skimage.viewer.utils import dialogs
|
||||
try:
|
||||
from skimage.viewer import utils
|
||||
from skimage.viewer.utils import dialogs
|
||||
from skimage.viewer.qt import QtCore, QtGui
|
||||
except ImportError:
|
||||
QtCore = None
|
||||
from numpy.testing.decorators import skipif
|
||||
from skimage.viewer import utils
|
||||
from skimage.viewer.utils import dialogs
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(QtCore is None)
|
||||
def test_event_loop():
|
||||
utils.init_qtapp()
|
||||
timer = QtCore.QTimer()
|
||||
@@ -16,7 +16,7 @@ def test_event_loop():
|
||||
utils.start_qtapp()
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(QtCore is None)
|
||||
def test_format_filename():
|
||||
fname = dialogs._format_filename(('apple', 2))
|
||||
assert fname == 'apple'
|
||||
@@ -24,7 +24,7 @@ def test_format_filename():
|
||||
assert fname is None
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(QtCore is None)
|
||||
def test_open_file_dialog():
|
||||
utils.init_qtapp()
|
||||
timer = QtCore.QTimer()
|
||||
@@ -33,7 +33,7 @@ def test_open_file_dialog():
|
||||
assert filename is None
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(QtCore is None)
|
||||
def test_save_file_dialog():
|
||||
utils.init_qtapp()
|
||||
timer = QtCore.QTimer()
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
|
||||
from skimage import data
|
||||
from skimage.viewer.qt import QtGui, QtCore
|
||||
from skimage.viewer import ImageViewer, CollectionViewer, viewer_available
|
||||
try:
|
||||
from skimage.viewer.qt import QtGui, QtCore
|
||||
from skimage.viewer import ImageViewer, CollectionViewer
|
||||
from skimage.viewer.plugins import OverlayPlugin
|
||||
except ImportError:
|
||||
ImageViewer = None
|
||||
from skimage.transform import pyramid_gaussian
|
||||
from skimage.viewer.plugins import OverlayPlugin
|
||||
from skimage.filters import sobel
|
||||
from numpy.testing import assert_equal
|
||||
from numpy.testing.decorators import skipif
|
||||
@@ -11,7 +14,7 @@ from skimage._shared.version_requirements import is_installed
|
||||
from skimage._shared._warnings import expected_warnings
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_viewer():
|
||||
astro = data.astronaut()
|
||||
coins = data.coins()
|
||||
@@ -38,7 +41,7 @@ def make_key_event(key):
|
||||
QtCore.Qt.NoModifier)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_collection_viewer():
|
||||
|
||||
img = data.astronaut()
|
||||
@@ -54,7 +57,7 @@ def test_collection_viewer():
|
||||
view._format_coord(10, 10)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
@skipif(not is_installed('matplotlib', '>=1.2'))
|
||||
def test_viewer_with_overlay():
|
||||
img = data.coins()
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
|
||||
import os
|
||||
from skimage import data, img_as_float, io, img_as_uint
|
||||
from skimage.viewer import ImageViewer, viewer_available
|
||||
from skimage.viewer.widgets import (
|
||||
Slider, OKCancelButtons, SaveButtons, ComboBox, CheckBox, Text)
|
||||
from skimage.viewer.plugins.base import Plugin
|
||||
from skimage.viewer.qt import QtGui, QtCore
|
||||
try:
|
||||
from skimage.viewer import ImageViewer
|
||||
from skimage.viewer.qt import QtGui, QtCore
|
||||
from skimage.viewer.widgets import (
|
||||
Slider, OKCancelButtons, SaveButtons, ComboBox, CheckBox, Text)
|
||||
from skimage.viewer.plugins.base import Plugin
|
||||
except ImportError:
|
||||
ImageViewer = None
|
||||
from numpy.testing import assert_almost_equal, assert_equal
|
||||
from numpy.testing.decorators import skipif
|
||||
from skimage._shared._warnings import expected_warnings
|
||||
@@ -18,7 +21,7 @@ def get_image_viewer():
|
||||
return viewer
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_check_box():
|
||||
viewer = get_image_viewer()
|
||||
cb = CheckBox('hello', value=True, alignment='left')
|
||||
@@ -33,7 +36,7 @@ def test_check_box():
|
||||
assert_equal(cb.val, False)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_combo_box():
|
||||
viewer = get_image_viewer()
|
||||
cb = ComboBox('hello', ('a', 'b', 'c'))
|
||||
@@ -46,7 +49,7 @@ def test_combo_box():
|
||||
assert_equal(cb.index, 2)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_text_widget():
|
||||
viewer = get_image_viewer()
|
||||
txt = Text('hello', 'hello, world!')
|
||||
@@ -57,7 +60,7 @@ def test_text_widget():
|
||||
assert_equal(str(txt.text), 'goodbye, world!')
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_slider_int():
|
||||
viewer = get_image_viewer()
|
||||
sld = Slider('radius', 2, 10, value_type='int')
|
||||
@@ -71,7 +74,7 @@ def test_slider_int():
|
||||
assert_equal(sld.val, 5)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_slider_float():
|
||||
viewer = get_image_viewer()
|
||||
sld = Slider('alpha', 2.1, 3.1, value=2.1, value_type='float',
|
||||
@@ -86,7 +89,7 @@ def test_slider_float():
|
||||
assert_almost_equal(sld.val, 2.5, 2)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_save_buttons():
|
||||
viewer = get_image_viewer()
|
||||
sv = SaveButtons()
|
||||
@@ -114,7 +117,7 @@ def test_save_buttons():
|
||||
os.remove(filename)
|
||||
|
||||
|
||||
@skipif(not viewer_available)
|
||||
@skipif(ImageViewer is None)
|
||||
def test_ok_buttons():
|
||||
viewer = get_image_viewer()
|
||||
ok = OKCancelButtons()
|
||||
|
||||
@@ -1,28 +1,17 @@
|
||||
import warnings
|
||||
|
||||
import numpy as np
|
||||
from skimage.viewer.qt import QtGui
|
||||
import matplotlib as mpl
|
||||
from matplotlib.figure import Figure
|
||||
from matplotlib import _pylab_helpers
|
||||
from matplotlib.colors import LinearSegmentedColormap
|
||||
|
||||
from ..qt import qt_api
|
||||
|
||||
try:
|
||||
import matplotlib as mpl
|
||||
from matplotlib.figure import Figure
|
||||
from matplotlib import _pylab_helpers
|
||||
from matplotlib.colors import LinearSegmentedColormap
|
||||
if not qt_api is None:
|
||||
from matplotlib.backends.backend_qt4 import FigureManagerQT
|
||||
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
|
||||
if 'agg' not in mpl.get_backend().lower():
|
||||
print("Recommended matplotlib backend is `Agg` for full "
|
||||
"skimage.viewer functionality.")
|
||||
else:
|
||||
FigureCanvasQTAgg = object
|
||||
LinearSegmentedColormap = object
|
||||
except ImportError:
|
||||
FigureCanvasQTAgg = object # hack to prevent nosetest and autodoc errors
|
||||
LinearSegmentedColormap = object
|
||||
|
||||
from ..qt import QtGui
|
||||
from matplotlib.backends.backend_qt4 import FigureManagerQT
|
||||
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
|
||||
if 'agg' not in mpl.get_backend().lower():
|
||||
warnings.warn("Recommended matplotlib backend is `Agg` for full "
|
||||
"skimage.viewer functionality.")
|
||||
|
||||
|
||||
__all__ = ['init_qtapp', 'start_qtapp', 'RequiredAttr', 'figimage',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import os
|
||||
|
||||
from ..qt import QtGui
|
||||
from skimage.viewer.qt import QtGui
|
||||
|
||||
|
||||
__all__ = ['open_file_dialog', 'save_file_dialog']
|
||||
|
||||
@@ -1,21 +1,15 @@
|
||||
"""
|
||||
ImageViewer class for viewing and interacting with images.
|
||||
"""
|
||||
from ..qt import QtGui, qt_api
|
||||
from ..qt.QtCore import Qt, Signal
|
||||
|
||||
if qt_api is not None:
|
||||
has_qt = True
|
||||
else:
|
||||
has_qt = False
|
||||
|
||||
from skimage.viewer.qt import QtWidgets, Qt, Signal
|
||||
from skimage import io, img_as_float
|
||||
from skimage.util.dtype import dtype_range
|
||||
from skimage.exposure import rescale_intensity
|
||||
import numpy as np
|
||||
from .. import utils
|
||||
from ..widgets import Slider
|
||||
from ..utils import dialogs
|
||||
from ..utils import (
|
||||
dialogs, init_qtapp, figimage, start_qtapp, update_axes_image)
|
||||
from ..plugins.base import Plugin
|
||||
|
||||
|
||||
@@ -152,7 +146,7 @@ class EventManager(object):
|
||||
tool.on_scroll(event)
|
||||
|
||||
|
||||
class ImageViewer(QtGui.QMainWindow):
|
||||
class ImageViewer(QtWidgets.QMainWindow):
|
||||
"""Viewer for displaying images.
|
||||
|
||||
This viewer is a simple container object that holds a Matplotlib axes
|
||||
@@ -194,7 +188,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
|
||||
def __init__(self, image, useblit=True):
|
||||
# Start main loop
|
||||
utils.init_qtapp()
|
||||
init_qtapp()
|
||||
super(ImageViewer, self).__init__()
|
||||
|
||||
#TODO: Add ImageViewer to skimage.io window manager
|
||||
@@ -202,7 +196,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
self.setAttribute(Qt.WA_DeleteOnClose)
|
||||
self.setWindowTitle("Image Viewer")
|
||||
|
||||
self.file_menu = QtGui.QMenu('&File', self)
|
||||
self.file_menu = QtWidgets.QMenu('&File', self)
|
||||
self.file_menu.addAction('Open file', self.open_file,
|
||||
Qt.CTRL + Qt.Key_O)
|
||||
self.file_menu.addAction('Save to file', self.save_to_file,
|
||||
@@ -211,7 +205,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
Qt.CTRL + Qt.Key_Q)
|
||||
self.menuBar().addMenu(self.file_menu)
|
||||
|
||||
self.main_widget = QtGui.QWidget()
|
||||
self.main_widget = QtWidgets.QWidget()
|
||||
self.setCentralWidget(self.main_widget)
|
||||
|
||||
if isinstance(image, Plugin):
|
||||
@@ -221,7 +215,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
# When plugin is started, start
|
||||
plugin._started.connect(self._show)
|
||||
|
||||
self.fig, self.ax = utils.figimage(image)
|
||||
self.fig, self.ax = figimage(image)
|
||||
self.canvas = self.fig.canvas
|
||||
self.canvas.setParent(self)
|
||||
self.ax.autoscale(enable=False)
|
||||
@@ -236,7 +230,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
self._update_original_image(image)
|
||||
self.plugins = []
|
||||
|
||||
self.layout = QtGui.QVBoxLayout(self.main_widget)
|
||||
self.layout = QtWidgets.QVBoxLayout(self.main_widget)
|
||||
self.layout.addWidget(self.canvas)
|
||||
|
||||
status_bar = self.statusBar()
|
||||
@@ -255,7 +249,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
if plugin.dock:
|
||||
location = self.dock_areas[plugin.dock]
|
||||
dock_location = Qt.DockWidgetArea(location)
|
||||
dock = QtGui.QDockWidget()
|
||||
dock = QtWidgets.QDockWidget()
|
||||
dock.setWidget(plugin)
|
||||
dock.setWindowTitle(plugin.name)
|
||||
self.addDockWidget(dock_location, dock)
|
||||
@@ -341,7 +335,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
"""
|
||||
self._show()
|
||||
if main_window:
|
||||
utils.start_qtapp()
|
||||
start_qtapp()
|
||||
return [p.output() for p in self.plugins]
|
||||
|
||||
def redraw(self):
|
||||
@@ -357,7 +351,7 @@ class ImageViewer(QtGui.QMainWindow):
|
||||
@image.setter
|
||||
def image(self, image):
|
||||
self._img = image
|
||||
utils.update_axes_image(self._image_plot, image)
|
||||
update_axes_image(self._image_plot, image)
|
||||
|
||||
# update display (otherwise image doesn't fill the canvas)
|
||||
h, w = image.shape[:2]
|
||||
@@ -487,7 +481,7 @@ class CollectionViewer(ImageViewer):
|
||||
self._update_original_image(image)
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
if type(event) == QtGui.QKeyEvent:
|
||||
if type(event) == QtWidgets.QKeyEvent:
|
||||
key = event.key()
|
||||
# Number keys (code: 0 = key 48, 9 = key 57) move to deciles
|
||||
if 48 <= key < 58:
|
||||
|
||||
@@ -15,17 +15,15 @@ parameter type specified by its `ptype` attribute, which can be:
|
||||
property of the same name that updates the display.
|
||||
|
||||
"""
|
||||
from ..qt import QtGui
|
||||
from ..qt import QtCore
|
||||
from ..qt.QtCore import Qt
|
||||
|
||||
from ..qt import QtWidgets, QtCore, Qt
|
||||
from ..utils import RequiredAttr
|
||||
|
||||
|
||||
__all__ = ['BaseWidget', 'Slider', 'ComboBox', 'CheckBox', 'Text']
|
||||
|
||||
|
||||
class BaseWidget(QtGui.QWidget):
|
||||
|
||||
class BaseWidget(QtWidgets.QWidget):
|
||||
|
||||
plugin = RequiredAttr("Widget is not attached to a Plugin.")
|
||||
|
||||
@@ -49,11 +47,11 @@ class Text(BaseWidget):
|
||||
|
||||
def __init__(self, name=None, text=''):
|
||||
super(Text, self).__init__(name)
|
||||
self._label = QtGui.QLabel()
|
||||
self._label = QtWidgets.QLabel()
|
||||
self.text = text
|
||||
self.layout = QtGui.QHBoxLayout(self)
|
||||
self.layout = QtWidgets.QHBoxLayout(self)
|
||||
if name is not None:
|
||||
name_label = QtGui.QLabel()
|
||||
name_label = QtWidgets.QLabel()
|
||||
name_label.setText(name)
|
||||
self.layout.addWidget(name_label)
|
||||
self.layout.addWidget(self._label)
|
||||
@@ -105,17 +103,17 @@ class Slider(BaseWidget):
|
||||
# Set widget orientation
|
||||
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
if orientation == 'vertical':
|
||||
self.slider = QtGui.QSlider(Qt.Vertical)
|
||||
self.slider = QtWidgets.QSlider(Qt.Vertical)
|
||||
alignment = QtCore.Qt.AlignHCenter
|
||||
align_text = QtCore.Qt.AlignHCenter
|
||||
align_value = QtCore.Qt.AlignHCenter
|
||||
self.layout = QtGui.QVBoxLayout(self)
|
||||
self.layout = QtWidgets.QVBoxLayout(self)
|
||||
elif orientation == 'horizontal':
|
||||
self.slider = QtGui.QSlider(Qt.Horizontal)
|
||||
self.slider = QtWidgets.QSlider(Qt.Horizontal)
|
||||
alignment = QtCore.Qt.AlignVCenter
|
||||
align_text = QtCore.Qt.AlignLeft
|
||||
align_value = QtCore.Qt.AlignRight
|
||||
self.layout = QtGui.QHBoxLayout(self)
|
||||
self.layout = QtWidgets.QHBoxLayout(self)
|
||||
else:
|
||||
msg = "Unexpected value %s for 'orientation'"
|
||||
raise ValueError(msg % orientation)
|
||||
@@ -151,11 +149,11 @@ class Slider(BaseWidget):
|
||||
raise ValueError("Unexpected value %s for 'update_on'" % update_on)
|
||||
self.slider.setFocusPolicy(QtCore.Qt.StrongFocus)
|
||||
|
||||
self.name_label = QtGui.QLabel()
|
||||
self.name_label = QtWidgets.QLabel()
|
||||
self.name_label.setText(self.name)
|
||||
self.name_label.setAlignment(align_text)
|
||||
|
||||
self.editbox = QtGui.QLineEdit()
|
||||
self.editbox = QtWidgets.QLineEdit()
|
||||
self.editbox.setMaximumWidth(max_edit_width)
|
||||
self.editbox.setText(self.value_fmt % self.val)
|
||||
self.editbox.setAlignment(align_value)
|
||||
@@ -229,20 +227,18 @@ class ComboBox(BaseWidget):
|
||||
def __init__(self, name, items, ptype='kwarg', callback=None):
|
||||
super(ComboBox, self).__init__(name, ptype, callback)
|
||||
|
||||
self.name_label = QtGui.QLabel()
|
||||
self.name_label = QtWidgets.QLabel()
|
||||
self.name_label.setText(self.name)
|
||||
self.name_label.setAlignment(QtCore.Qt.AlignLeft)
|
||||
|
||||
self._combo_box = QtGui.QComboBox()
|
||||
self._combo_box = QtWidgets.QComboBox()
|
||||
self._combo_box.addItems(list(items))
|
||||
|
||||
self.layout = QtGui.QHBoxLayout(self)
|
||||
self.layout = QtWidgets.QHBoxLayout(self)
|
||||
self.layout.addWidget(self.name_label)
|
||||
self.layout.addWidget(self._combo_box)
|
||||
|
||||
self._combo_box.currentIndexChanged.connect(self._value_changed)
|
||||
# self.connect(self._combo_box,
|
||||
# SIGNAL("currentIndexChanged(int)"), self.updateUi)
|
||||
|
||||
@property
|
||||
def val(self):
|
||||
@@ -283,11 +279,11 @@ class CheckBox(BaseWidget):
|
||||
callback=None):
|
||||
super(CheckBox, self).__init__(name, ptype, callback)
|
||||
|
||||
self._check_box = QtGui.QCheckBox()
|
||||
self._check_box = QtWidgets.QCheckBox()
|
||||
self._check_box.setChecked(value)
|
||||
self._check_box.setText(self.name)
|
||||
|
||||
self.layout = QtGui.QHBoxLayout(self)
|
||||
self.layout = QtWidgets.QHBoxLayout(self)
|
||||
if alignment == 'center':
|
||||
self.layout.setAlignment(QtCore.Qt.AlignCenter)
|
||||
elif alignment == 'left':
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
from textwrap import dedent
|
||||
|
||||
from ..qt import QtGui
|
||||
from ..qt import QtCore
|
||||
|
||||
from ..qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
|
||||
import skimage
|
||||
|
||||
Reference in New Issue
Block a user