Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 062cd15

Browse filesBrowse files
authored
Merge pull request #15685 from anntzer/isdeleted
MNT: Avoid a RuntimeError at animation shutdown with PySide2.
2 parents 4d8063f + 9bed63c commit 062cd15
Copy full SHA for 062cd15

File tree

Expand file treeCollapse file tree

2 files changed

+20
-3
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+20
-3
lines changed

‎lib/matplotlib/backends/backend_qt5.py

Copy file name to clipboardExpand all lines: lib/matplotlib/backends/backend_qt5.py
+8-1Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
from matplotlib.backend_managers import ToolManager
1818

1919
from .qt_compat import (
20-
QtCore, QtGui, QtWidgets, _getSaveFileName, is_pyqt5, __version__, QT_API)
20+
QtCore, QtGui, QtWidgets, _isdeleted, _getSaveFileName,
21+
is_pyqt5, __version__, QT_API)
2122

2223
backend_version = __version__
2324

@@ -185,6 +186,12 @@ def __init__(self, *args, **kwargs):
185186
self._timer.timeout.connect(self._on_timer)
186187
self._timer_set_interval()
187188

189+
def __del__(self):
190+
# The check for deletedness is needed to avoid an error at animation
191+
# shutdown with PySide2.
192+
if not _isdeleted(self._timer):
193+
self._timer_stop()
194+
188195
def _timer_set_single_shot(self):
189196
self._timer.setSingleShot(self._single)
190197

‎lib/matplotlib/backends/qt_compat.py

Copy file name to clipboardExpand all lines: lib/matplotlib/backends/qt_compat.py
+12-2Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,21 @@
6464

6565

6666
def _setup_pyqt5():
67-
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, _getSaveFileName
67+
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, \
68+
_isdeleted, _getSaveFileName
6869

6970
if QT_API == QT_API_PYQT5:
7071
from PyQt5 import QtCore, QtGui, QtWidgets
72+
import sip
7173
__version__ = QtCore.PYQT_VERSION_STR
7274
QtCore.Signal = QtCore.pyqtSignal
7375
QtCore.Slot = QtCore.pyqtSlot
7476
QtCore.Property = QtCore.pyqtProperty
77+
_isdeleted = sip.isdeleted
7578
elif QT_API == QT_API_PYSIDE2:
7679
from PySide2 import QtCore, QtGui, QtWidgets, __version__
80+
import shiboken2
81+
def _isdeleted(obj): return not shiboken2.isValid(obj)
7782
else:
7883
raise ValueError("Unexpected value for the 'backend.qt5' rcparam")
7984
_getSaveFileName = QtWidgets.QFileDialog.getSaveFileName
@@ -83,7 +88,8 @@ def is_pyqt5():
8388

8489

8590
def _setup_pyqt4():
86-
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, _getSaveFileName
91+
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, \
92+
_isdeleted, _getSaveFileName
8793

8894
def _setup_pyqt4_internal(api):
8995
global QtCore, QtGui, QtWidgets, \
@@ -103,6 +109,7 @@ def _setup_pyqt4_internal(api):
103109
except ValueError:
104110
pass
105111
from PyQt4 import QtCore, QtGui
112+
import sip # Always succeeds *after* importing PyQt4.
106113
__version__ = QtCore.PYQT_VERSION_STR
107114
# PyQt 4.6 introduced getSaveFileNameAndFilter:
108115
# https://riverbankcomputing.com/news/pyqt-46
@@ -111,16 +118,19 @@ def _setup_pyqt4_internal(api):
111118
QtCore.Signal = QtCore.pyqtSignal
112119
QtCore.Slot = QtCore.pyqtSlot
113120
QtCore.Property = QtCore.pyqtProperty
121+
_isdeleted = sip.isdeleted
114122
_getSaveFileName = QtGui.QFileDialog.getSaveFileNameAndFilter
115123

116124
if QT_API == QT_API_PYQTv2:
117125
_setup_pyqt4_internal(api=2)
118126
elif QT_API == QT_API_PYSIDE:
119127
from PySide import QtCore, QtGui, __version__, __version_info__
128+
import shiboken
120129
# PySide 1.0.3 fixed the following:
121130
# https://srinikom.github.io/pyside-bz-archive/809.html
122131
if __version_info__ < (1, 0, 3):
123132
raise ImportError("PySide<1.0.3 is not supported")
133+
def _isdeleted(obj): return not shiboken.isValid(obj)
124134
_getSaveFileName = QtGui.QFileDialog.getSaveFileName
125135
elif QT_API == QT_API_PYQT:
126136
_setup_pyqt4_internal(api=1)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.