From 1c3c46891c513aff8799aa04cc0c185b1cee7264 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 12 Dec 2013 15:36:29 -0600 Subject: [PATCH 1/4] Make sure self._idle is set to `True` in all cases Even if `draw` raises an exception. --- lib/matplotlib/backends/backend_qt4.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_qt4.py b/lib/matplotlib/backends/backend_qt4.py index 37092888bf57..3bbd2311a667 100644 --- a/lib/matplotlib/backends/backend_qt4.py +++ b/lib/matplotlib/backends/backend_qt4.py @@ -415,8 +415,10 @@ def draw_idle(self): self._idle = False def idle_draw(*args): - self.draw() - self._idle = True + try: + self.draw() + finally: + self._idle = True if d: QtCore.QTimer.singleShot(0, idle_draw) From 3108091126daac34811dd7917319769f5f2caba2 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Dec 2013 22:07:43 -0600 Subject: [PATCH 2/4] add try block in backend_gtk.py added block around `draw` in `idle_draw` which can raise an exception and will leave the window in a bad state. --- lib/matplotlib/backends/backend_gtk.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_gtk.py b/lib/matplotlib/backends/backend_gtk.py index c7c805972764..4135c8bc8c07 100644 --- a/lib/matplotlib/backends/backend_gtk.py +++ b/lib/matplotlib/backends/backend_gtk.py @@ -376,8 +376,10 @@ def draw(self): def draw_idle(self): def idle_draw(*args): - self.draw() - self._idle_draw_id = 0 + try: + self.draw() + finally: + self._idle_draw_id = 0 return False if self._idle_draw_id == 0: self._idle_draw_id = gobject.idle_add(idle_draw) From ed8e3576491030ab927abbfb0380c22f69e27dd5 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Dec 2013 22:11:50 -0600 Subject: [PATCH 3/4] added try block to backend_gtk3.py Added try block around `draw` in `idle_draw`. If `draw` raises an exception the figure is never marked idle again and pyplot functions will not work as expect. --- lib/matplotlib/backends/backend_gtk3.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index e915c29111e6..511f9b345cc3 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -322,8 +322,10 @@ def draw(self): def draw_idle(self): def idle_draw(*args): - self.draw() - self._idle_draw_id = 0 + try: + self.draw() + finally: + self._idle_draw_id = 0 return False if self._idle_draw_id == 0: self._idle_draw_id = GObject.idle_add(idle_draw) From a6fbc7fa90b09d0abac83b97ae36553727620f61 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Dec 2013 22:12:36 -0600 Subject: [PATCH 4/4] added try block in backend_tkagg.py Added try block around `draw` in `idle_draw`. If `draw` raises an exception the figure is never marked idle again and pyplot functions will not work as expect. --- lib/matplotlib/backends/backend_tkagg.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_tkagg.py b/lib/matplotlib/backends/backend_tkagg.py index 209a8520d044..c3bc260d547b 100644 --- a/lib/matplotlib/backends/backend_tkagg.py +++ b/lib/matplotlib/backends/backend_tkagg.py @@ -362,8 +362,10 @@ def draw_idle(self): d = self._idle self._idle = False def idle_draw(*args): - self.draw() - self._idle = True + try: + self.draw() + finally: + self._idle = True if d: self._idle_callback = self._tkcanvas.after_idle(idle_draw)