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 f4343a7

Browse filesBrowse files
committed
Avoid a RuntimeError at animation shutdown with PySide2.
1 parent fc413b3 commit f4343a7
Copy full SHA for f4343a7

File tree

Expand file treeCollapse file tree

2 files changed

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

2 files changed

+21
-3
lines changed

‎lib/matplotlib/backends/backend_qt5.py

Copy file name to clipboardExpand all lines: lib/matplotlib/backends/backend_qt5.py
+9-1Lines changed: 9 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

@@ -174,6 +175,7 @@ def wrapper(self, *args, **kwargs):
174175
return wrapper
175176

176177

178+
import shiboken2
177179
class TimerQT(TimerBase):
178180
"""
179181
Subclass of `.TimerBase` that uses Qt timer events.
@@ -200,6 +202,12 @@ def __init__(self, *args, **kwargs):
200202
self._timer.timeout.connect(self._on_timer)
201203
self._timer_set_interval()
202204

205+
def __del__(self):
206+
# The check for deletedness is needed to avoid an error at animation
207+
# shutdown with PySide2.
208+
if not _isdeleted(self._timer):
209+
self._timer_stop()
210+
203211
def _timer_set_single_shot(self):
204212
self._timer.setSingleShot(self._single)
205213

‎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
@@ -63,16 +63,21 @@
6363

6464

6565
def _setup_pyqt5():
66-
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, _getSaveFileName
66+
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, \
67+
_isdeleted, _getSaveFileName
6768

6869
if QT_API == QT_API_PYQT5:
6970
from PyQt5 import QtCore, QtGui, QtWidgets
71+
import sip
7072
__version__ = QtCore.PYQT_VERSION_STR
7173
QtCore.Signal = QtCore.pyqtSignal
7274
QtCore.Slot = QtCore.pyqtSlot
7375
QtCore.Property = QtCore.pyqtProperty
76+
_isdeleted = sip.isdeleted
7477
elif QT_API == QT_API_PYSIDE2:
7578
from PySide2 import QtCore, QtGui, QtWidgets, __version__
79+
import shiboken2
80+
def _isdeleted(obj): return not shiboken2.isValid(obj)
7681
else:
7782
raise ValueError("Unexpected value for the 'backend.qt5' rcparam")
7883
_getSaveFileName = QtWidgets.QFileDialog.getSaveFileName
@@ -82,7 +87,8 @@ def is_pyqt5():
8287

8388

8489
def _setup_pyqt4():
85-
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, _getSaveFileName
90+
global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, \
91+
_isdeleted, _getSaveFileName
8692

8793
def _setup_pyqt4_internal(api):
8894
global QtCore, QtGui, QtWidgets, \
@@ -102,6 +108,7 @@ def _setup_pyqt4_internal(api):
102108
except ValueError:
103109
pass
104110
from PyQt4 import QtCore, QtGui
111+
import sip # Always succeeds *after* importing PyQt4.
105112
__version__ = QtCore.PYQT_VERSION_STR
106113
# PyQt 4.6 introduced getSaveFileNameAndFilter:
107114
# https://riverbankcomputing.com/news/pyqt-46
@@ -110,16 +117,19 @@ def _setup_pyqt4_internal(api):
110117
QtCore.Signal = QtCore.pyqtSignal
111118
QtCore.Slot = QtCore.pyqtSlot
112119
QtCore.Property = QtCore.pyqtProperty
120+
_isdeleted = sip.isdeleted
113121
_getSaveFileName = QtGui.QFileDialog.getSaveFileNameAndFilter
114122

115123
if QT_API == QT_API_PYQTv2:
116124
_setup_pyqt4_internal(api=2)
117125
elif QT_API == QT_API_PYSIDE:
118126
from PySide import QtCore, QtGui, __version__, __version_info__
127+
import shiboken
119128
# PySide 1.0.3 fixed the following:
120129
# https://srinikom.github.io/pyside-bz-archive/809.html
121130
if __version_info__ < (1, 0, 3):
122131
raise ImportError("PySide<1.0.3 is not supported")
132+
def _isdeleted(obj): return not shiboken.isValid(obj)
123133
_getSaveFileName = QtGui.QFileDialog.getSaveFileName
124134
elif QT_API == QT_API_PYQT:
125135
_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.