Skip to content

Commit d309d51

Browse files
committed
Fix compatibility with Matplotlib 3.7 and Qt6.
- enum scoping change. - exec vs. exec_. - Matplotlib no longer exports _getSaveFileName (only PyQt4 required a separate _getSaveFileName because it called that function getSaveFileNameAndFilter instead; let's not try to support qt4 anymore). Also, PyQt and PySide use different parameter names for this function; pass parameters positionally instead. - addAction parameter order changed between qt5 and qt6, but we can call it in a way that's compatible with everyone by using setShortcut instead. - QAction moved between qt5 and qt6 but we don't need to explicitly instantiate it; we can use addAction instead to do so.
1 parent 65b657f commit d309d51

File tree

3 files changed

+52
-60
lines changed

3 files changed

+52
-60
lines changed

README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Dependencies:
2727
* `colorspacious <https://pypi.python.org/pypi/colorspacious>`_
2828
* Matplotlib
2929
* NumPy
30+
* one of PyQt6, PySide6, PyQt5 (>=5.13.1), or PySide2
3031

3132
License:
3233
MIT, see LICENSE.txt for details.

viscm/bezierbuilder.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
from matplotlib.backends.qt_compat import QtGui, QtCore
4343
from .minimvc import Trigger
4444

45+
46+
Qt = QtCore.Qt
47+
48+
4549
class ControlPointModel(object):
4650
def __init__(self, xp, yp, fixed=None):
4751
# fixed is either None (if no point is fixed) or and index of a fixed
@@ -113,12 +117,13 @@ def on_button_press(self, event):
113117
if event.inaxes != self.ax:
114118
return
115119
res, ind = self.control_polygon.contains(event)
116-
if res and modkey == QtCore.Qt.NoModifier:
120+
if res and modkey == Qt.KeyboardModifier.NoModifier:
117121
self._index = ind["ind"][0]
118-
if res and (modkey == QtCore.Qt.ControlModifier or self.mode == "remove"):
122+
if res and (modkey == Qt.KeyboardModifier.ControlModifier
123+
or self.mode == "remove"):
119124
# Control-click deletes
120125
self.control_point_model.remove_point(ind["ind"][0])
121-
if (modkey == QtCore.Qt.ShiftModifier or self.mode == "add"):
126+
if (modkey == Qt.KeyboardModifier.ShiftModifier or self.mode == "add"):
122127

123128
# Adding a new point. Find the two closest points and insert it in
124129
# between them.

viscm/gui.py

Lines changed: 43 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#matplotlib.rcParams['backend'] = "QT4AGG"
1616
# Do this first before any other matplotlib imports, to force matplotlib to
1717
# use a Qt backend
18-
from matplotlib.backends.qt_compat import QtWidgets, QtCore, QtGui, _getSaveFileName
18+
from matplotlib.backends.qt_compat import QtWidgets, QtCore, QtGui
1919

2020
try:
2121
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
@@ -39,6 +39,9 @@
3939
from .minimvc import Trigger
4040

4141

42+
Qt = QtCore.Qt
43+
44+
4245
# The correct L_A value for the standard sRGB viewing conditions is:
4346
# (64 / np.pi) / 5
4447
# Due to an error in our color conversion code, the matplotlib colormaps were
@@ -1033,8 +1036,8 @@ def main(argv):
10331036
if args.quit:
10341037
sys.exit()
10351038

1036-
figureCanvas.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
1037-
QtWidgets.QSizePolicy.Expanding)
1039+
figureCanvas.setSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding,
1040+
QtWidgets.QSizePolicy.Policy.Expanding)
10381041
figureCanvas.updateGeometry()
10391042

10401043
mainwindow.resize(800, 600)
@@ -1050,7 +1053,7 @@ def main(argv):
10501053
import signal
10511054
signal.signal(signal.SIGINT, signal.SIG_DFL)
10521055

1053-
app.exec_()
1056+
(getattr(app, "exec", None) or getattr(app, "exec_"))()
10541057

10551058
def about():
10561059
QtWidgets.QMessageBox.about(None, "VISCM",
@@ -1061,19 +1064,17 @@ def about():
10611064
class ViewerWindow(QtWidgets.QMainWindow):
10621065
def __init__(self, figurecanvas, viscm, cmapname, parent=None):
10631066
QtWidgets.QMainWindow.__init__(self, parent)
1064-
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
1067+
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
10651068
self.main_widget = QtWidgets.QWidget(self)
10661069
self.cmapname = cmapname
10671070

10681071
file_menu = QtWidgets.QMenu('&File', self)
1069-
file_menu.addAction('&Save', self.save,
1070-
QtCore.Qt.CTRL + QtCore.Qt.Key_S)
1071-
file_menu.addAction('&Quit', self.fileQuit,
1072-
QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
1072+
file_menu.addAction('&Save', self.save).setShortcut('Ctrl+S')
1073+
file_menu.addAction('&Quit', self.fileQuit).setShortcut('Ctrl+Q')
10731074

10741075
options_menu = QtWidgets.QMenu('&Options', self)
1075-
options_menu.addAction('&Toggle Gamut', self.toggle_gamut,
1076-
QtCore.Qt.CTRL + QtCore.Qt.Key_G)
1076+
options_menu.addAction(
1077+
'&Toggle Gamut', self.toggle_gamut).setShortcut('Ctrl+G')
10771078

10781079
help_menu = QtWidgets.QMenu('&Help', self)
10791080
help_menu.addAction('&About', about)
@@ -1103,9 +1104,8 @@ def closeEvent(self, ce):
11031104
self.fileQuit()
11041105

11051106
def save(self):
1106-
fileName, _ = _getSaveFileName(
1107-
caption="Save file",
1108-
directory=self.cmapname + ".png",
1107+
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
1108+
self, "Save file", self.cmapname + ".png",
11091109
filter="Image Files (*.png *.jpg *.bmp)")
11101110
if fileName:
11111111
self.viscm.save_figure(fileName)
@@ -1114,19 +1114,17 @@ def save(self):
11141114
class EditorWindow(QtWidgets.QMainWindow):
11151115
def __init__(self, figurecanvas, viscm_editor, parent=None):
11161116
QtWidgets.QMainWindow.__init__(self, parent)
1117-
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
1117+
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
11181118
self.viscm_editor = viscm_editor
11191119

11201120
file_menu = QtWidgets.QMenu('&File', self)
1121-
file_menu.addAction('&Save', self.save,
1122-
QtCore.Qt.CTRL + QtCore.Qt.Key_S)
1121+
file_menu.addAction('&Save', self.save).setShortcut('Ctrl+S')
11231122
file_menu.addAction("&Export .py", self.export)
1124-
file_menu.addAction('&Quit', self.fileQuit,
1125-
QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
1123+
file_menu.addAction('&Quit', self.fileQuit).setShortcut('Ctrl+Q')
11261124

11271125
options_menu = QtWidgets.QMenu('&Options', self)
1128-
options_menu.addAction('&Load in Viewer', self.loadviewer,
1129-
QtCore.Qt.CTRL + QtCore.Qt.Key_V)
1126+
options_menu.addAction(
1127+
'&Load in Viewer', self.loadviewer).setShortcut('Ctrl+V')
11301128

11311129
help_menu = QtWidgets.QMenu('&Help', self)
11321130
help_menu.addAction('&About', about)
@@ -1138,21 +1136,23 @@ def __init__(self, figurecanvas, viscm_editor, parent=None):
11381136

11391137
self.main_widget = QtWidgets.QWidget(self)
11401138

1141-
self.max_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
1139+
self.max_slider = QtWidgets.QSlider(Qt.Orientation.Horizontal)
11421140
self.max_slider.setMinimum(0)
11431141
self.max_slider.setMaximum(100)
11441142
self.max_slider.setValue(viscm_editor.max_Jp)
1145-
self.max_slider.setTickPosition(QtWidgets.QSlider.TicksBelow)
1143+
self.max_slider.setTickPosition(
1144+
QtWidgets.QSlider.TickPosition.TicksBelow)
11461145
self.max_slider.setTickInterval(10)
11471146
self.max_slider.valueChanged.connect(self.updatejp)
11481147
self.max_slider_num = QtWidgets.QLabel(str(viscm_editor.max_Jp))
11491148
self.max_slider_num.setFixedWidth(30)
11501149

1151-
self.min_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
1150+
self.min_slider = QtWidgets.QSlider(Qt.Orientation.Horizontal)
11521151
self.min_slider.setMinimum(0)
11531152
self.min_slider.setMaximum(100)
11541153
self.min_slider.setValue(viscm_editor.min_Jp)
1155-
self.min_slider.setTickPosition(QtWidgets.QSlider.TicksBelow)
1154+
self.min_slider.setTickPosition(
1155+
QtWidgets.QSlider.TickPosition.TicksBelow)
11561156
self.min_slider.setTickInterval(10)
11571157
self.min_slider.valueChanged.connect(self.updatejp)
11581158
self.min_slider_num = QtWidgets.QLabel(str(viscm_editor.min_Jp))
@@ -1176,7 +1176,7 @@ def __init__(self, figurecanvas, viscm_editor, parent=None):
11761176
mainlayout.addLayout(min_slider_layout)
11771177

11781178
if viscm_editor.cmtype == "diverging":
1179-
smoothness_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
1179+
smoothness_slider = QtWidgets.QSlider(Qt.Horizontal)
11801180
# We want the slider to vary filter_k exponentially between 5 and
11811181
# 1000. So it should go from [log10(5), log10(1000)]
11821182
# which is about [0.699, 3.0]
@@ -1193,7 +1193,7 @@ def __init__(self, figurecanvas, viscm_editor, parent=None):
11931193
metrics = QtGui.QFontMetrics(smoothness_slider_num.font())
11941194
max_width = metrics.width("1000.00")
11951195
smoothness_slider_num.setFixedWidth(max_width)
1196-
smoothness_slider_num.setAlignment(QtCore.Qt.AlignRight)
1196+
smoothness_slider_num.setAlignment(Qt.AlignRight)
11971197
self.smoothness_slider_num = smoothness_slider_num
11981198

11991199
smoothness_slider_layout = QtWidgets.QHBoxLayout()
@@ -1208,42 +1208,30 @@ def __init__(self, figurecanvas, viscm_editor, parent=None):
12081208
viscm_editor.cmap_model.filter_k_trigger.add_callback(
12091209
self.update_smoothness_slider)
12101210

1211-
self.moveAction = QtWidgets.QAction("Drag points", self)
1211+
self.toolbar = self.addToolBar('Tools')
1212+
self.moveAction = self.toolbar.addAction("Drag points")
12121213
self.moveAction.triggered.connect(self.set_move_mode)
12131214
self.moveAction.setCheckable(True)
1214-
1215-
self.addAction = QtWidgets.QAction("Add points", self)
1215+
self.addAction = self.toolbar.addAction("Add points")
12161216
self.addAction.triggered.connect(self.set_add_mode)
12171217
self.addAction.setCheckable(True)
1218-
1219-
self.removeAction = QtWidgets.QAction("Remove points", self)
1218+
self.removeAction = self.toolbar.addAction("Remove points")
12201219
self.removeAction.triggered.connect(self.set_remove_mode)
12211220
self.removeAction.setCheckable(True)
1222-
1223-
self.swapAction = QtWidgets.QAction("Flip brightness", self)
1221+
self.toolbar.addSeparator()
1222+
self.swapAction = self.toolbar.addAction("Flip brightness")
12241223
self.swapAction.triggered.connect(self.swapjp)
1225-
renameAction = QtWidgets.QAction("Rename colormap", self)
1224+
self.toolbar.addSeparator()
1225+
renameAction = self.toolbar.addAction("Rename colormap")
12261226
renameAction.triggered.connect(self.rename)
1227-
1228-
saveAction = QtWidgets.QAction('Save', self)
1227+
saveAction = self.toolbar.addAction("Save")
12291228
saveAction.triggered.connect(self.save)
12301229

1231-
1232-
self.toolbar = self.addToolBar('Tools')
1233-
self.toolbar.addAction(self.moveAction)
1234-
self.toolbar.addAction(self.addAction)
1235-
self.toolbar.addAction(self.removeAction)
1236-
self.toolbar.addSeparator()
1237-
self.toolbar.addAction(self.swapAction)
1238-
self.toolbar.addSeparator()
1239-
self.toolbar.addAction(renameAction)
1240-
self.toolbar.addAction(saveAction)
1241-
12421230
self.moveAction.setChecked(True)
12431231

12441232
self.main_widget.setFocus()
12451233
figurecanvas.setFocus()
1246-
figurecanvas.setFocusPolicy(QtCore.Qt.StrongFocus)
1234+
figurecanvas.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
12471235
self.setCentralWidget(self.main_widget)
12481236

12491237
def rename(self):
@@ -1293,9 +1281,8 @@ def set_remove_mode(self):
12931281
self.viscm_editor.bezier_builder.mode = "remove"
12941282

12951283
def export(self):
1296-
fileName, _ = _getSaveFileName(
1297-
caption="Export file",
1298-
directory=self.viscm_editor.name + ".py",
1284+
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
1285+
self, "Export file", self.viscm_editor.name + ".py",
12991286
filter=".py (*.py)")
13001287
if fileName:
13011288
self.viscm_editor.export_py(fileName)
@@ -1307,9 +1294,8 @@ def closeEvent(self, ce):
13071294
self.fileQuit()
13081295

13091296
def save(self):
1310-
fileName, _ = _getSaveFileName(
1311-
caption="Save file",
1312-
directory=self.viscm_editor.name + ".jscm",
1297+
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
1298+
self, "Save file", self.viscm_editor.name + ".jscm",
13131299
filter="JSCM Files (*.jscm)")
13141300
if fileName:
13151301
self.viscm_editor.save_colormap(fileName)
@@ -1320,8 +1306,8 @@ def loadviewer(self):
13201306
cm = self.viscm_editor.show_viscm()
13211307
v = viscm(cm, name=self.viscm_editor.name, figure=newfig)
13221308

1323-
newcanvas.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
1324-
QtWidgets.QSizePolicy.Expanding)
1309+
newcanvas.setSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding,
1310+
QtWidgets.QSizePolicy.Policy.Expanding)
13251311
newcanvas.updateGeometry()
13261312

13271313
newwindow = ViewerWindow(newcanvas, v, self.viscm_editor.name, parent=self)

0 commit comments

Comments
 (0)