@@ -1221,11 +1221,16 @@ class Event:
1221
1221
guiEvent
1222
1222
The GUI event that triggered the Matplotlib event.
1223
1223
"""
1224
+
1224
1225
def __init__ (self , name , canvas , guiEvent = None ):
1225
1226
self .name = name
1226
1227
self .canvas = canvas
1227
1228
self .guiEvent = guiEvent
1228
1229
1230
+ def _process (self ):
1231
+ """Generate an event with name ``self.name`` on ``self.canvas``."""
1232
+ self .canvas .callbacks .process (self .name , self )
1233
+
1229
1234
1230
1235
class DrawEvent (Event ):
1231
1236
"""
@@ -1268,14 +1273,28 @@ class ResizeEvent(Event):
1268
1273
height : int
1269
1274
Height of the canvas in pixels.
1270
1275
"""
1276
+
1271
1277
def __init__ (self , name , canvas ):
1272
1278
super ().__init__ (name , canvas )
1273
1279
self .width , self .height = canvas .get_width_height ()
1274
1280
1281
+ def _process (self ):
1282
+ super ()._process ()
1283
+ self .canvas .draw_idle ()
1284
+
1275
1285
1276
1286
class CloseEvent (Event ):
1277
1287
"""An event triggered by a figure being closed."""
1278
1288
1289
+ def _process (self ):
1290
+ try :
1291
+ super ()._process ()
1292
+ except (AttributeError , TypeError ):
1293
+ pass
1294
+ # Suppress AttributeError/TypeError that occur when the python
1295
+ # session is being killed. It may be that a better solution would
1296
+ # be a mechanism to disconnect all callbacks upon shutdown.
1297
+
1279
1298
1280
1299
class LocationEvent (Event ):
1281
1300
"""
@@ -1295,7 +1314,7 @@ class LocationEvent(Event):
1295
1314
is not over an Axes.
1296
1315
"""
1297
1316
1298
- lastevent = None # the last event that was triggered before this one
1317
+ lastevent = None # The last event processed so far.
1299
1318
1300
1319
def __init__ (self , name , canvas , x , y , guiEvent = None ):
1301
1320
super ().__init__ (name , canvas , guiEvent = guiEvent )
@@ -1309,7 +1328,6 @@ def __init__(self, name, canvas, x, y, guiEvent=None):
1309
1328
1310
1329
if x is None or y is None :
1311
1330
# cannot check if event was in Axes if no (x, y) info
1312
- self ._update_enter_leave ()
1313
1331
return
1314
1332
1315
1333
if self .canvas .mouse_grabber is None :
@@ -1327,33 +1345,21 @@ def __init__(self, name, canvas, x, y, guiEvent=None):
1327
1345
self .xdata = xdata
1328
1346
self .ydata = ydata
1329
1347
1330
- self ._update_enter_leave ()
1331
-
1332
- def _update_enter_leave (self ):
1333
- """Process the figure/axes enter leave events."""
1334
- if LocationEvent .lastevent is not None :
1335
- last = LocationEvent .lastevent
1336
- if last .inaxes != self .inaxes :
1337
- # process Axes enter/leave events
1348
+ def _process (self ):
1349
+ last = LocationEvent .lastevent
1350
+ last_axes = last .inaxes if last is not None else None
1351
+ if last_axes != self .inaxes :
1352
+ if last_axes is not None :
1338
1353
try :
1339
- if last .inaxes is not None :
1340
- last .canvas .callbacks .process ('axes_leave_event' , last )
1354
+ last .canvas .callbacks .process ("axes_leave_event" , last )
1341
1355
except Exception :
1356
+ # The last canvas may already have been torn down.
1342
1357
pass
1343
- # See ticket 2901582.
1344
- # I think this is a valid exception to the rule
1345
- # against catching all exceptions; if anything goes
1346
- # wrong, we simply want to move on and process the
1347
- # current event.
1348
- if self .inaxes is not None :
1349
- self .canvas .callbacks .process ('axes_enter_event' , self )
1350
-
1351
- else :
1352
- # process a figure enter event
1353
1358
if self .inaxes is not None :
1354
- self .canvas .callbacks .process ('axes_enter_event' , self )
1355
-
1356
- LocationEvent .lastevent = self
1359
+ self .canvas .callbacks .process ("axes_enter_event" , self )
1360
+ LocationEvent .lastevent = (
1361
+ None if self .name == "figure_leave_event" else self )
1362
+ super ()._process ()
1357
1363
1358
1364
1359
1365
class MouseButton (IntEnum ):
@@ -1376,11 +1382,16 @@ class MouseEvent(LocationEvent):
1376
1382
----------
1377
1383
button : None or `MouseButton` or {'up', 'down'}
1378
1384
The button pressed. 'up' and 'down' are used for scroll events.
1385
+
1379
1386
Note that LEFT and RIGHT actually refer to the "primary" and
1380
1387
"secondary" buttons, i.e. if the user inverts their left and right
1381
1388
buttons ("left-handed setting") then the LEFT button will be the one
1382
1389
physically on the right.
1383
1390
1391
+ If this is unset, *name* is "scroll_event", and and *step* is nonzero,
1392
+ then this will be set to "up" or "down" depending on the sign of
1393
+ *step*.
1394
+
1384
1395
key : None or str
1385
1396
The key pressed when the mouse event triggered, e.g. 'shift'.
1386
1397
See `KeyEvent`.
@@ -1414,6 +1425,11 @@ def __init__(self, name, canvas, x, y, button=None, key=None,
1414
1425
step = 0 , dblclick = False , guiEvent = None ):
1415
1426
if button in MouseButton .__members__ .values ():
1416
1427
button = MouseButton (button )
1428
+ if name == "scroll_event" and button is None :
1429
+ if step > 0 :
1430
+ button = "up"
1431
+ elif step < 0 :
1432
+ button = "down"
1417
1433
self .button = button
1418
1434
self .key = key
1419
1435
self .step = step
@@ -1423,6 +1439,17 @@ def __init__(self, name, canvas, x, y, button=None, key=None,
1423
1439
# 'axes_enter_event', which requires a fully initialized event.
1424
1440
super ().__init__ (name , canvas , x , y , guiEvent = guiEvent )
1425
1441
1442
+ def _process (self ):
1443
+ if self .name == "button_press_event" :
1444
+ self .canvas ._button = self .button
1445
+ elif self .name == "button_release_event" :
1446
+ self .canvas ._button = None
1447
+ if self .button is None and self .name != "scroll_event" :
1448
+ self .button = self .canvas ._button
1449
+ if self .key is None :
1450
+ self .key = self .canvas ._key
1451
+ super ()._process ()
1452
+
1426
1453
def __str__ (self ):
1427
1454
return (f"{ self .name } : "
1428
1455
f"xy=({ self .x } , { self .y } ) xydata=({ self .xdata } , { self .ydata } ) "
@@ -1468,8 +1495,11 @@ def on_pick(event):
1468
1495
1469
1496
cid = fig.canvas.mpl_connect('pick_event', on_pick)
1470
1497
"""
1498
+
1471
1499
def __init__ (self , name , canvas , mouseevent , artist ,
1472
1500
guiEvent = None , ** kwargs ):
1501
+ if guiEvent is None :
1502
+ guiEvent = mouseevent .guiEvent
1473
1503
super ().__init__ (name , canvas , guiEvent )
1474
1504
self .mouseevent = mouseevent
1475
1505
self .artist = artist
@@ -1507,11 +1537,19 @@ def on_key(event):
1507
1537
1508
1538
cid = fig.canvas.mpl_connect('key_press_event', on_key)
1509
1539
"""
1540
+
1510
1541
def __init__ (self , name , canvas , key , x = 0 , y = 0 , guiEvent = None ):
1511
1542
self .key = key
1512
1543
# super-init deferred to the end: callback errors if called before
1513
1544
super ().__init__ (name , canvas , x , y , guiEvent = guiEvent )
1514
1545
1546
+ def _process (self ):
1547
+ if self .name == "key_press_event" :
1548
+ self .canvas ._key = self .key
1549
+ elif self .name == "key_release_event" :
1550
+ self .canvas ._key = None
1551
+ super ()._process ()
1552
+
1515
1553
1516
1554
def _get_renderer (figure , print_method = None ):
1517
1555
"""
@@ -1693,12 +1731,16 @@ def resize(self, w, h):
1693
1731
not a requirement of, nor is it used by, Matplotlib itself.
1694
1732
"""
1695
1733
1734
+ @_api .deprecated ("3.6" , alternative = (
1735
+ "callbacks.process('draw_event', DrawEvent(...))" ))
1696
1736
def draw_event (self , renderer ):
1697
1737
"""Pass a `DrawEvent` to all functions connected to ``draw_event``."""
1698
1738
s = 'draw_event'
1699
1739
event = DrawEvent (s , self , renderer )
1700
1740
self .callbacks .process (s , event )
1701
1741
1742
+ @_api .deprecated ("3.6" , alternative = (
1743
+ "callbacks.process('resize_event', ResizeEvent(...))" ))
1702
1744
def resize_event (self ):
1703
1745
"""
1704
1746
Pass a `ResizeEvent` to all functions connected to ``resize_event``.
@@ -1708,6 +1750,8 @@ def resize_event(self):
1708
1750
self .callbacks .process (s , event )
1709
1751
self .draw_idle ()
1710
1752
1753
+ @_api .deprecated ("3.6" , alternative = (
1754
+ "callbacks.process('close_event', CloseEvent(...))" ))
1711
1755
def close_event (self , guiEvent = None ):
1712
1756
"""
1713
1757
Pass a `CloseEvent` to all functions connected to ``close_event``.
@@ -1724,6 +1768,8 @@ def close_event(self, guiEvent=None):
1724
1768
# AttributeError occurs on OSX with qt4agg upon exiting
1725
1769
# with an open window; 'callbacks' attribute no longer exists.
1726
1770
1771
+ @_api .deprecated ("3.6" , alternative = (
1772
+ "callbacks.process('key_press_event', KeyEvent(...))" ))
1727
1773
def key_press_event (self , key , guiEvent = None ):
1728
1774
"""
1729
1775
Pass a `KeyEvent` to all functions connected to ``key_press_event``.
@@ -1734,6 +1780,8 @@ def key_press_event(self, key, guiEvent=None):
1734
1780
s , self , key , self ._lastx , self ._lasty , guiEvent = guiEvent )
1735
1781
self .callbacks .process (s , event )
1736
1782
1783
+ @_api .deprecated ("3.6" , alternative = (
1784
+ "callbacks.process('key_release_event', KeyEvent(...))" ))
1737
1785
def key_release_event (self , key , guiEvent = None ):
1738
1786
"""
1739
1787
Pass a `KeyEvent` to all functions connected to ``key_release_event``.
@@ -1744,6 +1792,8 @@ def key_release_event(self, key, guiEvent=None):
1744
1792
self .callbacks .process (s , event )
1745
1793
self ._key = None
1746
1794
1795
+ @_api .deprecated ("3.6" , alternative = (
1796
+ "callbacks.process('pick_event', PickEvent(...))" ))
1747
1797
def pick_event (self , mouseevent , artist , ** kwargs ):
1748
1798
"""
1749
1799
Callback processing for pick events.
@@ -1760,6 +1810,8 @@ def pick_event(self, mouseevent, artist, **kwargs):
1760
1810
** kwargs )
1761
1811
self .callbacks .process (s , event )
1762
1812
1813
+ @_api .deprecated ("3.6" , alternative = (
1814
+ "callbacks.process('scroll_event', MouseEvent(...))" ))
1763
1815
def scroll_event (self , x , y , step , guiEvent = None ):
1764
1816
"""
1765
1817
Callback processing for scroll events.
@@ -1780,6 +1832,8 @@ def scroll_event(self, x, y, step, guiEvent=None):
1780
1832
step = step , guiEvent = guiEvent )
1781
1833
self .callbacks .process (s , mouseevent )
1782
1834
1835
+ @_api .deprecated ("3.6" , alternative = (
1836
+ "callbacks.process('button_press_event', MouseEvent(...))" ))
1783
1837
def button_press_event (self , x , y , button , dblclick = False , guiEvent = None ):
1784
1838
"""
1785
1839
Callback processing for mouse button press events.
@@ -1797,6 +1851,8 @@ def button_press_event(self, x, y, button, dblclick=False, guiEvent=None):
1797
1851
dblclick = dblclick , guiEvent = guiEvent )
1798
1852
self .callbacks .process (s , mouseevent )
1799
1853
1854
+ @_api .deprecated ("3.6" , alternative = (
1855
+ "callbacks.process('button_release_event', MouseEvent(...))" ))
1800
1856
def button_release_event (self , x , y , button , guiEvent = None ):
1801
1857
"""
1802
1858
Callback processing for mouse button release events.
@@ -1821,6 +1877,8 @@ def button_release_event(self, x, y, button, guiEvent=None):
1821
1877
self .callbacks .process (s , event )
1822
1878
self ._button = None
1823
1879
1880
+ @_api .deprecated ("3.6" , alternative = (
1881
+ "callbacks.process('motion_notify_event', MouseEvent(...))" ))
1824
1882
def motion_notify_event (self , x , y , guiEvent = None ):
1825
1883
"""
1826
1884
Callback processing for mouse movement events.
@@ -1846,6 +1904,8 @@ def motion_notify_event(self, x, y, guiEvent=None):
1846
1904
guiEvent = guiEvent )
1847
1905
self .callbacks .process (s , event )
1848
1906
1907
+ @_api .deprecated ("3.6" , alternative = (
1908
+ "callbacks.process('leave_notify_event', LocationEvent(...))" ))
1849
1909
def leave_notify_event (self , guiEvent = None ):
1850
1910
"""
1851
1911
Callback processing for the mouse cursor leaving the canvas.
@@ -1862,6 +1922,8 @@ def leave_notify_event(self, guiEvent=None):
1862
1922
LocationEvent .lastevent = None
1863
1923
self ._lastx , self ._lasty = None , None
1864
1924
1925
+ @_api .deprecated ("3.6" , alternative = (
1926
+ "callbacks.process('enter_notify_event', LocationEvent(...))" ))
1865
1927
def enter_notify_event (self , guiEvent = None , xy = None ):
1866
1928
"""
1867
1929
Callback processing for the mouse cursor entering the canvas.
0 commit comments