Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 062cd15

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

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

lib/matplotlib/backends/backend_qt5.py

Lines 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

Lines 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)