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

Skip to content

Commit b561849

Browse files
authored
Merge pull request #18912 from anntzer/cbr
Use CallbackRegistry for {Artist,Collection}.add_callback.
2 parents 082495c + bf95c8c commit b561849

File tree

2 files changed

+7
-15
lines changed

2 files changed

+7
-15
lines changed

lib/matplotlib/artist.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,7 @@ def __init__(self):
119119
# only if they override get_cursor_data.
120120
self._mouseover = type(self).get_cursor_data != Artist.get_cursor_data
121121
self.eventson = False # fire events only if eventson
122-
self._oid = 0 # an observer id
123-
self._propobservers = {} # a dict from oids to funcs
122+
self._callbacks = cbook.CallbackRegistry()
124123
try:
125124
self.axes = None
126125
except AttributeError:
@@ -341,10 +340,9 @@ def func(artist: Artist) -> Any
341340
--------
342341
remove_callback
343342
"""
344-
oid = self._oid
345-
self._propobservers[oid] = func
346-
self._oid += 1
347-
return oid
343+
# Wrapping func in a lambda ensures it can be connected multiple times
344+
# and never gets weakref-gc'ed.
345+
return self._callbacks.connect("pchanged", lambda: func(self))
348346

349347
def remove_callback(self, oid):
350348
"""
@@ -354,10 +352,7 @@ def remove_callback(self, oid):
354352
--------
355353
add_callback
356354
"""
357-
try:
358-
del self._propobservers[oid]
359-
except KeyError:
360-
pass
355+
self._callbacks.disconnect("pchanged", oid)
361356

362357
def pchanged(self):
363358
"""
@@ -370,8 +365,7 @@ def pchanged(self):
370365
add_callback
371366
remove_callback
372367
"""
373-
for oid, func in self._propobservers.items():
374-
func(self)
368+
self._callbacks.process("pchanged")
375369

376370
def is_transform_set(self):
377371
"""

lib/matplotlib/container.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ def __new__(cls, *args, **kwargs):
1919

2020
def __init__(self, kl, label=None):
2121
self.eventson = False # fire events only if eventson
22-
self._oid = 0 # an observer id
23-
self._propobservers = {} # a dict from oids to funcs
22+
self._callbacks = cbook.CallbackRegistry()
2423
self._remove_method = None
2524
self.set_label(label)
2625

@@ -29,7 +28,6 @@ def remove(self):
2928
self, scalarp=lambda x: isinstance(x, Artist)):
3029
if c is not None:
3130
c.remove()
32-
3331
if self._remove_method:
3432
self._remove_method(self)
3533

0 commit comments

Comments
 (0)