SourceForge logo
SourceForge logo
Menu

matplotlib-devel — matplotlib developers

You can subscribe to this list here.

2003 Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
(1)
Nov
(33)
Dec
(20)
2004 Jan
(7)
Feb
(44)
Mar
(51)
Apr
(43)
May
(43)
Jun
(36)
Jul
(61)
Aug
(44)
Sep
(25)
Oct
(82)
Nov
(97)
Dec
(47)
2005 Jan
(77)
Feb
(143)
Mar
(42)
Apr
(31)
May
(93)
Jun
(93)
Jul
(35)
Aug
(78)
Sep
(56)
Oct
(44)
Nov
(72)
Dec
(75)
2006 Jan
(116)
Feb
(99)
Mar
(181)
Apr
(171)
May
(112)
Jun
(86)
Jul
(91)
Aug
(111)
Sep
(77)
Oct
(72)
Nov
(57)
Dec
(51)
2007 Jan
(64)
Feb
(116)
Mar
(70)
Apr
(74)
May
(53)
Jun
(40)
Jul
(519)
Aug
(151)
Sep
(132)
Oct
(74)
Nov
(282)
Dec
(190)
2008 Jan
(141)
Feb
(67)
Mar
(69)
Apr
(96)
May
(227)
Jun
(404)
Jul
(399)
Aug
(96)
Sep
(120)
Oct
(205)
Nov
(126)
Dec
(261)
2009 Jan
(136)
Feb
(136)
Mar
(119)
Apr
(124)
May
(155)
Jun
(98)
Jul
(136)
Aug
(292)
Sep
(174)
Oct
(126)
Nov
(126)
Dec
(79)
2010 Jan
(109)
Feb
(83)
Mar
(139)
Apr
(91)
May
(79)
Jun
(164)
Jul
(184)
Aug
(146)
Sep
(163)
Oct
(128)
Nov
(70)
Dec
(73)
2011 Jan
(235)
Feb
(165)
Mar
(147)
Apr
(86)
May
(74)
Jun
(118)
Jul
(65)
Aug
(75)
Sep
(162)
Oct
(94)
Nov
(48)
Dec
(44)
2012 Jan
(49)
Feb
(40)
Mar
(88)
Apr
(35)
May
(52)
Jun
(69)
Jul
(90)
Aug
(123)
Sep
(112)
Oct
(120)
Nov
(105)
Dec
(116)
2013 Jan
(76)
Feb
(26)
Mar
(78)
Apr
(43)
May
(61)
Jun
(53)
Jul
(147)
Aug
(85)
Sep
(83)
Oct
(122)
Nov
(18)
Dec
(27)
2014 Jan
(58)
Feb
(25)
Mar
(49)
Apr
(17)
May
(29)
Jun
(39)
Jul
(53)
Aug
(52)
Sep
(35)
Oct
(47)
Nov
(110)
Dec
(27)
2015 Jan
(50)
Feb
(93)
Mar
(96)
Apr
(30)
May
(55)
Jun
(83)
Jul
(44)
Aug
(8)
Sep
(5)
Oct
Nov
(1)
Dec
(1)
2016 Jan
Feb
Mar
(1)
Apr
May
Jun
(2)
Jul
Aug
(3)
Sep
(1)
Oct
(3)
Nov
Dec
2017 Jan
Feb
(5)
Mar
Apr
May
Jun
Jul
(3)
Aug
Sep
(7)
Oct
Nov
Dec
2018 Jan
Feb
Mar
Apr
May
Jun
Jul
(2)
Aug
Sep
Oct
Nov
Dec
S M T W T F S






1
2
(2)
3
(7)
4
(3)
5
(7)
6
(18)
7
(6)
8
9
(1)
10
(1)
11
(1)
12
13
(5)
14
(2)
15
(2)
16
17
(2)
18
19
20
21
22
(1)
23
(2)
24
(3)
25
(6)
26
(1)
27
28
(8)
29
(9)
30
(3)
31
(4)





Showing 6 results of 6

From: Paul I. <piv...@gm...> - 2011年10月25日 22:58:28
On Tue, Oct 25, 2011 at 3:52 PM, Daniel Hyams <dh...@gm...> wrote:
> For small bugfixes, am I supposed to fork from v1.1.x, or master?
I say 'master' (Mike's been pushing some things to v1.1.x, but as he
said in a comment to #551, "Pushed to v1.1.x since this is pretty
serious yet simple-to-fix bug -- it should be on the maintenance
branch.")
best,
-- 
Paul Ivanov
314 address only used for lists, off-list direct email at:
http://pirsquared.org | GPG/PGP key id: 0x0F3E28F7
From: Benjamin R. <ben...@ou...> - 2011年10月25日 22:57:00
On Tuesday, October 25, 2011, Daniel Hyams <dh...@gm...> wrote:
> For small bugfixes, am I supposed to fork from v1.1.x, or master?
>
V1.1.x is the maintenance branch. Master is for new features. When
bugfixes are made and merged to v1.1.x, we then merge it to master.
Ben Root
From: Daniel H. <dh...@gm...> - 2011年10月25日 22:52:44
For small bugfixes, am I supposed to fork from v1.1.x, or master?
-- 
Daniel Hyams
dh...@gm...
From: Tobin H. V. P. <to...@i3...> - 2011年10月25日 17:46:41
Daniel -
Yes that works. In my case - I hate to edit any existing third party 
code bases - or it bites me later when I upgrade.
For now - I simply do my own dead reference clean up externally when 
doing the deletes. Really, that would be the same as just doing a 
disconnect - but for other reasons (not worth going into detail here) 
- I prefer deleting and not having to know all of the connection 
points. My solution ensures that the dead references aren't around 
later.
I mainly wanted to get it out into the devel community - get smart 
eyeballs on it - and hope that it gets addresses in a future release.
It will likely be a fairly straightforward fix - as you show.
From: Daniel H. <dh...@gm...> - 2011年10月25日 17:17:12
I've run into this same issue in the past, and have it "fixed" in my
own local copy of matplotlib. I just placed a check to make sure that
cid actually was in the callbacks for s before deleting it.
That is quite possibly a band-aid; I never looked far enough in to
see. But it is possibly another way of fixing the problem.
 def process(self, s, *args, **kwargs):
 """
 process signal *s*. All of the functions registered to receive
 callbacks on *s* will be called with *\*args* and *\*\*kwargs*
 """
 if s in self.callbacks:
 for cid, proxy in self.callbacks[s].items():
 # Clean out dead references
 if proxy.inst is not None and proxy.inst() is None:
 if cid in self.callbacks[s]: #<------- here
 del self.callbacks[s][cid]
 else:
 proxy(*args, **kwargs)
On Tue, Oct 25, 2011 at 1:09 PM, <to...@i3...> wrote:
> Here is a bit more detail and a simple example.
>
> The example below places red squares in an axes. When the user clicks on an existing red square - another square is created and added. When the user hits any key a square is deleted from the axes. The error is triggered by clicking on the red square and then hitting any key, and then clicking a red square again.
>
> Diagnosis:
> By monitoring cbook.py line 235 and cbook.py line 263 it can be seen that after the second mouse click (following one of the squares being deleted), that the process() function builds a loop and begins handling the button press callbacks. Note that there is a dead reference coming later in this list. The first callback involves another square being created and the connect() method being called. In the connect() call - the dead reference is deleted from the callback list. Now upon returning to the process() callback this dead reference is no longer in the callback list and a Key Exception is triggered once it gets to it in the loop.
>
> Problem:
> There are two locations where dead references are cleared from the callback list. When these loops get intermingled - as the case with a callback leading to another connect mid-loop - the exception occurs when both loops attempt to delete the dead reference.
>
> Possible Solutions:
> 1. Trap the KeyException at the point of attempting to delete it from the list in both places.
>
> 2. Place the dead reference check and deletion within a single method ... and perform this check at beginning of the process() and connect() methods before processing callbacks.
>
>
> Sample Code
> --------------------
>
> import matplotlib
> matplotlib.use('WXAGG')
>
> from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
> from matplotlib.pyplot import Figure, Axes, Rectangle
>
> import wx
> import random
>
> class SquareManager(object):
>  def __init__(self, axes):
>    self.axes = axes
>    self.canvas = axes.figure.canvas
>    self.squares = []
>    self.last_x = 0
>
>    self.canvas.mpl_connect('key_press_event', self.on_key_press)
>
>  def add_square(self):
>    self.last_x += .1
>    s = Square(self, self.axes, [self.last_x, .4],
>          .05, .05, facecolor='red', edgecolor='black')
>    self.squares.append(s)
>    self._refresh()
>
>  def on_key_press(self, evt):
>    if len(self.squares) == 0: return
>
>    # delete the first square - results in no error
>    # self.squares[0].remove()
>    # del self.squares[0]
>
>    # delete the last square - results in the error
>    self.squares[-1].remove()
>    del self.squares[-1]
>
>    self._refresh()
>
>  def _refresh(self):
>    self.canvas.draw()
>
>
> class Square(Rectangle):
>  def __init__(self, manager, axes, *args, **kwds):
>    Rectangle.__init__(self, *args, **kwds)
>    axes.add_patch(self)
>
>    self.manager = manager
>    axes.figure.canvas.mpl_connect('button_press_event', self.selected)
>
>  def selected(self, evt):
>    within, _ = self.contains(evt)
>    if within:
>      self.manager.add_square()
>
>
> app = wx.PySimpleApp()
> frame = wx.Frame(None)
> fig = Figure()
> canvas = FigureCanvasWxAgg(frame, -1, fig)
> a = Axes(fig, [.1, .1, .8, .8])
> fig.add_axes(a)
>
> sm = SquareManager(a)
> sm.add_square()
>
> frame.Show()
> app.MainLoop()
>
>
> # To demonstrate the error:
> #
> # 1. click on red sqaure
> # 2. press any key
> # 3. click on red sqaure again
>
>
>
>
>
>
>
>
>
> ------------------------------------------------------------------------------
> The demand for IT networking professionals continues to grow, and the
> demand for specialized networking skills is growing even more rapidly.
> Take a complimentary Learning@Cisco Self-Assessment and learn
> about Cisco certifications, training, and career opportunities.
> http://p.sf.net/sfu/cisco-dev2dev
> _______________________________________________
> Matplotlib-devel mailing list
> Mat...@li...
> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel
>
-- 
Daniel Hyams
dh...@gm...
From: <to...@i3...> - 2011年10月25日 17:09:16
Here is a bit more detail and a simple example.
The example below places red squares in an axes. When the user clicks on an existing red square - another square is created and added. When the user hits any key a square is deleted from the axes. The error is triggered by clicking on the red square and then hitting any key, and then clicking a red square again.
Diagnosis:
By monitoring cbook.py line 235 and cbook.py line 263 it can be seen that after the second mouse click (following one of the squares being deleted), that the process() function builds a loop and begins handling the button press callbacks. Note that there is a dead reference coming later in this list. The first callback involves another square being created and the connect() method being called. In the connect() call - the dead reference is deleted from the callback list. Now upon returning to the process() callback this dead reference is no longer in the callback list and a Key Exception is triggered once it gets to it in the loop.
Problem:
There are two locations where dead references are cleared from the callback list. When these loops get intermingled - as the case with a callback leading to another connect mid-loop - the exception occurs when both loops attempt to delete the dead reference.
Possible Solutions:
1. Trap the KeyException at the point of attempting to delete it from the list in both places.
2. Place the dead reference check and deletion within a single method ... and perform this check at beginning of the process() and connect() methods before processing callbacks.
Sample Code
--------------------
import matplotlib
matplotlib.use('WXAGG')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.pyplot import Figure, Axes, Rectangle
import wx
import random
class SquareManager(object):
 def __init__(self, axes):
 self.axes = axes
 self.canvas = axes.figure.canvas 
 self.squares = []
 self.last_x = 0
 
 self.canvas.mpl_connect('key_press_event', self.on_key_press)
 
 def add_square(self):
 self.last_x += .1
 s = Square(self, self.axes, [self.last_x, .4],
 .05, .05, facecolor='red', edgecolor='black')
 self.squares.append(s)
 self._refresh()
 
 def on_key_press(self, evt):
 if len(self.squares) == 0: return
 
 # delete the first square - results in no error
 # self.squares[0].remove()
 # del self.squares[0]
 
 # delete the last square - results in the error
 self.squares[-1].remove()
 del self.squares[-1]
 
 self._refresh()
 
 def _refresh(self):
 self.canvas.draw()
class Square(Rectangle):
 def __init__(self, manager, axes, *args, **kwds):
 Rectangle.__init__(self, *args, **kwds)
 axes.add_patch(self)
 
 self.manager = manager
 axes.figure.canvas.mpl_connect('button_press_event', self.selected)
 
 def selected(self, evt):
 within, _ = self.contains(evt)
 if within:
 self.manager.add_square()
app = wx.PySimpleApp()
frame = wx.Frame(None)
fig = Figure()
canvas = FigureCanvasWxAgg(frame, -1, fig)
a = Axes(fig, [.1, .1, .8, .8])
fig.add_axes(a)
sm = SquareManager(a)
sm.add_square()
 
frame.Show()
app.MainLoop()
# To demonstrate the error:
#
# 1. click on red sqaure
# 2. press any key
# 3. click on red sqaure again
 

Showing 6 results of 6

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /