From 4ab583ba31800fa986a63e00c1ecc475889b2dea Mon Sep 17 00:00:00 2001 From: Tony S Yu Date: Fri, 3 Aug 2012 21:50:28 -0400 Subject: [PATCH] ENH: Add SaveButtons widget. --- skimage/viewer/plugins/base.py | 1 + skimage/viewer/widgets/__init__.py | 1 + skimage/viewer/widgets/core.py | 5 ++ skimage/viewer/widgets/history.py | 66 ++++++++++++++++++++++++ viewer_examples/plugins/median_filter.py | 18 +++++++ 5 files changed, 91 insertions(+) create mode 100644 skimage/viewer/widgets/history.py create mode 100644 viewer_examples/plugins/median_filter.py diff --git a/skimage/viewer/plugins/base.py b/skimage/viewer/plugins/base.py index 562237b2..7c00ded8 100644 --- a/skimage/viewer/plugins/base.py +++ b/skimage/viewer/plugins/base.py @@ -137,6 +137,7 @@ class Plugin(QtGui.QDialog): widget.callback = self.filter_image elif widget.ptype == 'plugin': widget.callback = self.update_plugin + widget.plugin = self self.layout.addWidget(widget, self.row, 0) self.row += 1 diff --git a/skimage/viewer/widgets/__init__.py b/skimage/viewer/widgets/__init__.py index 5af24064..6552a313 100644 --- a/skimage/viewer/widgets/__init__.py +++ b/skimage/viewer/widgets/__init__.py @@ -1 +1,2 @@ from core import * +from history import * diff --git a/skimage/viewer/widgets/core.py b/skimage/viewer/widgets/core.py index 27cb187f..8610f910 100644 --- a/skimage/viewer/widgets/core.py +++ b/skimage/viewer/widgets/core.py @@ -19,17 +19,22 @@ from PyQt4.QtCore import Qt from PyQt4 import QtGui from PyQt4 import QtCore +from ..utils import RequiredAttr + __all__ = ['BaseWidget', 'Slider', 'ComboBox'] class BaseWidget(QtGui.QWidget): + plugin = RequiredAttr("Widget is not attached to a Plugin.") + def __init__(self, name, ptype, callback): super(BaseWidget, self).__init__() self.name = name self.ptype = ptype self.callback = callback + self.plugin = None @property def val(self): diff --git a/skimage/viewer/widgets/history.py b/skimage/viewer/widgets/history.py new file mode 100644 index 00000000..daaf38cd --- /dev/null +++ b/skimage/viewer/widgets/history.py @@ -0,0 +1,66 @@ +import os +from textwrap import dedent + +from PyQt4 import QtGui + +from skimage import io +from .core import BaseWidget + + +__all__ = ['SaveButtons'] + + +class SaveButtons(BaseWidget): + + def __init__(self, default_format='png'): + name = 'Save to:' + ptype = None + callback = None + super(SaveButtons, self).__init__(name, ptype, callback) + + self.default_format = default_format + + self.name_label = QtGui.QLabel() + self.name_label.setText(name) + + self.save_file = QtGui.QPushButton('File') + self.save_file.clicked.connect(self.save_to_file) + self.save_stack = QtGui.QPushButton('Stack') + self.save_stack.clicked.connect(self.save_to_stack) + + self.layout = QtGui.QHBoxLayout(self) + self.layout.addWidget(self.name_label) + self.layout.addWidget(self.save_stack) + self.layout.addWidget(self.save_file) + + def save_to_stack(self): + image = self.plugin.image_viewer.image.copy() + io.push(image) + + msg = dedent('''\ + The image has been pushed to the io stack. + Use io.pop() to retrieve the most recently pushed image. + NOTE: The io stack only works in interactive sessions.''') + notify(msg) + + def save_to_file(self): + filename = str(QtGui.QFileDialog.getSaveFileName()) + if len(filename) == 0: + return + #TODO: io plugins should assign default image formats + basename, ext = os.path.splitext(filename) + if not ext: + filename = '%s.%s' % (filename, self.default_format) + io.imsave(filename, self.plugin.image_viewer.image) + + +def notify(msg): + msglabel = QtGui.QLabel(msg) + dialog = QtGui.QDialog() + ok = QtGui.QPushButton('OK', dialog) + ok.clicked.connect(dialog.accept) + ok.setDefault(True) + dialog.layout = QtGui.QGridLayout(dialog) + dialog.layout.addWidget(msglabel, 0, 0, 1, 3) + dialog.layout.addWidget(ok, 1, 1) + dialog.exec_() diff --git a/viewer_examples/plugins/median_filter.py b/viewer_examples/plugins/median_filter.py new file mode 100644 index 00000000..57d04397 --- /dev/null +++ b/viewer_examples/plugins/median_filter.py @@ -0,0 +1,18 @@ +from skimage import data +from skimage.filter import median_filter + +from skimage.viewer import ImageViewer +from skimage.viewer.widgets import Slider +from skimage.viewer.widgets.history import SaveButtons +from skimage.viewer.plugins.overlayplugin import Plugin + + +image = data.coins() +viewer = ImageViewer(image) + +plugin = Plugin(image_filter=median_filter) +plugin += Slider('radius', 2, 10, value_type='int', update_on='release') +plugin += SaveButtons() + +viewer += plugin +viewer.show()