From 87440e5bad9fe0cc409b7a6205b15c65b50c1677 Mon Sep 17 00:00:00 2001 From: Ray Osborn Date: Fri, 9 Aug 2024 15:13:53 -0500 Subject: [PATCH] Replace deprecated libraries --- src/nexpy/gui/datadialogs.py | 4 +--- src/nexpy/gui/plotview.py | 31 ++++++++++++++++--------------- src/nexpy/gui/utils.py | 27 ++++++++++++++------------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/nexpy/gui/datadialogs.py b/src/nexpy/gui/datadialogs.py index cb65fc40..7f197e81 100644 --- a/src/nexpy/gui/datadialogs.py +++ b/src/nexpy/gui/datadialogs.py @@ -10,12 +10,12 @@ import numbers import os import shutil +from importlib.resources import files as package_files from operator import attrgetter from pathlib import Path import matplotlib as mpl import numpy as np -import pkg_resources from matplotlib.legend import Legend from matplotlib.rcsetup import validate_aspect, validate_float from nexusformat.nexus import (NeXusError, NXattr, NXdata, NXentry, NXfield, @@ -1875,9 +1875,7 @@ def accept(self): output[output == str(np.nan)] = '' np.savetxt(fname, output, header=header, delimiter=self.delimiter, comments='', fmt='%s') - logging.info(f"Data saved as '{fname}'") - super().accept() class LockDialog(NXDialog): diff --git a/src/nexpy/gui/plotview.py b/src/nexpy/gui/plotview.py index 423293d9..b692358d 100644 --- a/src/nexpy/gui/plotview.py +++ b/src/nexpy/gui/plotview.py @@ -35,10 +35,10 @@ from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas from matplotlib.colors import LogNorm, Normalize, SymLogNorm from matplotlib.figure import Figure -from matplotlib.image import imread from matplotlib.lines import Line2D from matplotlib.ticker import AutoLocator, LogLocator, ScalarFormatter -from packaging.version import parse as pv +from packaging.version import Version +from PIL import Image from .pyqt import QtCore, QtGui, QtWidgets @@ -67,8 +67,8 @@ ProjectionDialog, ScanDialog, StyleDialog) from .utils import (boundaries, centers, divgray_map, find_nearest, fix_projection, get_color, in_dark_mode, iterable, - keep_data, parula_map, report_error, report_exception, - resource_file, resource_icon, xtec_map) + keep_data, load_image, parula_map, report_error, + report_exception, resource_file, resource_icon, xtec_map) from .widgets import (NXCheckBox, NXcircle, NXComboBox, NXDoubleSpinBox, NXellipse, NXLabel, NXpolygon, NXPushButton, NXrectangle, NXSlider, NXSpinBox) @@ -86,7 +86,7 @@ 'seismic', 'coolwarm', 'twilight', 'divgray', # diverging 'RdBu', 'RdYlBu', 'RdYlGn'] -if pv(mpl.__version__) >= pv('3.5.0'): +if Version(mpl.__version__) >= Version('3.5.0'): mpl.colormaps.register(parula_map()) mpl.colormaps.register(xtec_map()) mpl.colormaps.register(divgray_map()) @@ -125,8 +125,9 @@ 'o': 'circle', 's': 'square', 'D': 'diamond', 'H': 'hexagon', 'v': 'triangle_down', '^': 'triangle_up', '<': 'triangle_left', '>': 'triangle_right', 'None': 'None'} -logo = imread(resource_file('NeXpy.png'))[180:880, 50:1010] -warnings.filterwarnings("ignore", category=DeprecationWarning) +logo = load_image(resource_file('NeXpy.png'))[180:880, 50:1010] +logo["title"] = '"NeXpy"' +# warnings.filterwarnings("ignore", category=DeprecationWarning) def new_figure_manager(label=None, *args, **kwargs): @@ -606,7 +607,7 @@ def deactivate(self): def display_logo(self): """Display the NeXpy logo in the plotting pane.""" - self.plot(NXdata(logo, title='NeXpy'), image=True) + self.plot(logo, image=True) self.ax.xaxis.set_visible(False) self.ax.yaxis.set_visible(False) self.ax.title.set_visible(False) @@ -1087,7 +1088,7 @@ def plot_image(self, over=False, **opts): else: opts['interpolation'] = self.interpolation - if pv(mpl.__version__) >= pv('3.5.0'): + if Version(mpl.__version__) >= Version('3.5.0'): cm = copy.copy(mpl.colormaps[self.cmap]) else: cm = copy.copy(get_cmap(self.cmap)) @@ -1222,7 +1223,7 @@ def set_data_limits(self): self.vaxis.lo = 0.5 else: self.vaxis.lo = -0.5 - if pv(mpl.__version__) >= pv('3.5.0'): + if Version(mpl.__version__) >= Version('3.5.0'): nc = len(mpl.colormaps[self.cmap].colors) else: nc = len(get_cmap(self.cmap).colors) @@ -1365,7 +1366,7 @@ def replot_axes(self, draw=True): def update_colorbar(self): if self.colorbar: - if pv(mpl.__version__) >= pv('3.1.0'): + if Version(mpl.__version__) >= Version('3.1.0'): self.colorbar.update_normal(self.image) else: self.colorbar.set_norm(self.norm) @@ -1373,7 +1374,7 @@ def update_colorbar(self): if self.vtab.qualitative: vmin, vmax = [int(i+0.5) for i in self.image.get_clim()] self.colorbar.set_ticks(range(vmin, vmax)) - if pv(mpl.__version__) >= pv('3.5.0'): + if Version(mpl.__version__) >= Version('3.5.0'): if self.cmap == 'xtec': vmin, vmax = (0.5, self.vaxis.max_data+0.5) else: @@ -1515,7 +1516,7 @@ def symlog(self, linthresh=None, linscale=None, vmax=None): self.vaxis.max = self.vaxis.hi = vmax self.colorbar.locator = AutoLocator() self.colorbar.formatter = ScalarFormatter() - if pv(mpl.__version__) >= pv('3.1.0'): + if Version(mpl.__version__) >= Version('3.1.0'): self.image.set_norm(SymLogNorm(linthresh, linscale=linscale, vmin=-vmax, vmax=vmax)) else: @@ -3477,7 +3478,7 @@ def cmap(self, cmap): if cmap is None: cmap = self._cached_cmap try: - if pv(mpl.__version__) >= pv('3.5.0'): + if Version(mpl.__version__) >= Version('3.5.0'): cm = copy.copy(mpl.colormaps[cmap]) else: cm = copy.copy(get_cmap(cmap)) @@ -3901,7 +3902,7 @@ def __init__(self, canvas, parent=None, coordinates=True): NavigationToolbar2.__init__(self, canvas) if in_dark_mode() and ( - pv(QtCore.__version__) <= pv('5.15')): + Version(QtCore.__version__) <= Version('5.15')): self.setStyleSheet('color: black') self.plotview = canvas.parent() self.zoom() diff --git a/src/nexpy/gui/utils.py b/src/nexpy/gui/utils.py index 54e32311..be37c13e 100644 --- a/src/nexpy/gui/utils.py +++ b/src/nexpy/gui/utils.py @@ -29,6 +29,7 @@ from matplotlib import rcParams from matplotlib.colors import colorConverter, hex2color, rgb2hex from packaging.version import Version +from PIL import Image from .pyqt import QtCore, QtGui, QtWidgets @@ -42,8 +43,8 @@ fabio = None from nexusformat.nexus import (NeXusError, NXcollection, NXdata, NXfield, - NXLock, NXLockException, NXnote, - nxgetconfig, nxload, nxsetconfig) + NXLock, NXLockException, NXnote, nxgetconfig, + nxload, nxsetconfig) ansi_re = re.compile(r'\x1b' + r'\[([\dA-Fa-f;]*?)m') @@ -131,8 +132,9 @@ def run_pythonw(script_path): return import platform import warnings - from distutils.version import StrictVersion - if (StrictVersion(platform.release()) > StrictVersion('19.0.0') and + + from packaging.version import Version + if (Version(platform.release()) > Version('19.0.0') and 'CONDA_PREFIX' in os.environ): pythonw_path = Path(sys.exec_prefix).joinpath('bin', 'pythonw') if pythonw_path.exists(): @@ -589,10 +591,9 @@ def cmyk_to_rgb(c, m, y, k): def load_image(filename): - if os.path.splitext(filename.lower())[1] in ['.png', '.jpg', '.jpeg', - '.gif']: - from matplotlib.image import imread - im = imread(filename) + if Path(filename).suffix.lower() in ['.png', '.jpg', '.jpeg', '.gif']: + with Image.open(filename) as PIL_image: + im = np.array(PIL_image) z = NXfield(im, name='z') y = NXfield(range(z.shape[0]), name='y') x = NXfield(range(z.shape[1]), name='x') @@ -623,14 +624,14 @@ def load_image(filename): for k, v in im.header.items(): if v or v == 0: header[k] = v - data.header = header + data["header"] = header if im.getclassname() == 'CbfImage': note = NXnote(type='text/plain', file_name=filename) - note.data = im.header.pop('_array_data.header_contents', '') - note.description = im.header.pop( + note["data"] = im.header.pop('_array_data.header_contents', '') + note["description"] = im.header.pop( '_array_data.header_convention', '') - data.CBF_header = note - data.title = filename + data["CBF_header"] = note + data["title"] = filename return data