Ok, seems this needs some more detailed bug report. With Qt5Agg backend, py 3.6 on windows 8.1, running the example as script produces This error (hidden for convenience)QWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedQWidget::repaint: Recursive repaint detectedTraceback (most recent call last): File "d:\data\computer\entwicklung\python\matplotlib\sour self.draw() File "d:\data\computer\entwicklung\python\matplotlib\sour self.figure.draw(self.renderer) File "d:\data\computer\entwicklung\python\matplotlib\sour return draw(artist, renderer, *args, **kwargs) File "d:\data\computer\entwicklung\python\matplotlib\sour renderer, self, artists, self.suppressComposite) File "d:\data\computer\entwicklung\python\matplotlib\sour a.draw(renderer) File "d:\data\computer\entwicklung\python\matplotlib\sour return draw(artist, renderer, *args, **kwargs) File "d:\data\computer\entwicklung\python\matplotlib\sour mimage._draw_list_compositing_images(renderer, self, ar File "d:\data\computer\entwicklung\python\matplotlib\sour a.draw(renderer) File "d:\data\computer\entwicklung\python\matplotlib\sour return draw(artist, renderer, *args, **kwargs) File "d:\data\computer\entwicklung\python\matplotlib\sour ticks_to_draw = self._update_ticks(renderer) File "d:\data\computer\entwicklung\python\matplotlib\sour tick_tups = list(self.iter_ticks()) # iter_ticks calls File "d:\data\computer\entwicklung\python\matplotlib\sour majorLocs = self.major.locator() File "d:\data\computer\entwicklung\python\matplotlib\sour return self.tick_values(vmin, vmax) File "d:\data\computer\entwicklung\python\matplotlib\sour locs = self._raw_ticks(vmin, vmax) File "d:\data\computer\entwicklung\python\matplotlib\sour nbins = np.clip(self.axis.get_tick_space(), File "d:\data\computer\entwicklung\python\matplotlib\sour tick = self._get_tick(True) File "d:\data\computer\entwicklung\python\matplotlib\sour return XTick(self.axes, 0, '', major=major, **tick_kw) File "d:\data\computer\entwicklung\python\matplotlib\sour self.apply_tickdir(tickdir) File "d:\data\computer\entwicklung\python\matplotlib\sour self.stale = True File "d:\data\computer\entwicklung\python\matplotlib\sour self.stale_callback(self, val) File "d:\data\computer\entwicklung\python\matplotlib\sour self.axes.stale = val File "d:\data\computer\entwicklung\python\matplotlib\sour self.stale_callback(self, val) File "d:\data\computer\entwicklung\python\matplotlib\sour self.figure.stale = val File "d:\data\computer\entwicklung\python\matplotlib\sour self.stale_callback(self, val) File "d:\data\computer\entwicklung\python\matplotlib\sour if val and matplotlib.is_interactive() and not fig.canvRecursionError: maximum recursion depth exceededQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, abortedQWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0, type: 1QPainter::end: Painter not active, aborted
...this is hidden, collapsable content... With TkAgg backend, py 3.6 on windows 8.1, running the example as script runs fine without error and produces the desired plot. Removing the lineself.canvas.blit(self.ax.bbox) as proposed here, lets the script run fine in TkAgg backend as well as Qt5Agg backend. This led me to the conclusion that, similarly to thepoly_editor example, one should not try to blit inside thedraw_event callback. Logically this makes sense to me because there is no reason to blit if the figure is drawn anyways shortly afterwards. @anntzer What kind of error do you get when running this with the line in question removed? Does the same happen for the poly_editor example as it is now? |
PR Summary
Thepath editor example errors when being run with an interactive backend, due to a recursion in drawing the elements.
This PR fixes this issue by not blitting inside the draw_event (because that happens before the screen update anyways).