@@ -1220,11 +1220,16 @@ class Event:
1220
1220
guiEvent
1221
1221
The GUI event that triggered the Matplotlib event.
1222
1222
"""
1223
+
1223
1224
def __init__ (self , name , canvas , guiEvent = None ):
1224
1225
self .name = name
1225
1226
self .canvas = canvas
1226
1227
self .guiEvent = guiEvent
1227
1228
1229
+ def _process (self ):
1230
+ """Generate an event with name ``self.name`` on ``self.canvas``."""
1231
+ self .canvas .callbacks .process (self .name , self )
1232
+
1228
1233
1229
1234
class DrawEvent (Event ):
1230
1235
"""
@@ -1267,6 +1272,7 @@ class ResizeEvent(Event):
1267
1272
height : int
1268
1273
Height of the canvas in pixels.
1269
1274
"""
1275
+
1270
1276
def __init__ (self , name , canvas ):
1271
1277
super ().__init__ (name , canvas )
1272
1278
self .width , self .height = canvas .get_width_height ()
@@ -1294,7 +1300,7 @@ class LocationEvent(Event):
1294
1300
is not over an Axes.
1295
1301
"""
1296
1302
1297
- lastevent = None # the last event that was triggered before this one
1303
+ lastevent = None # The last event processed so far.
1298
1304
1299
1305
def __init__ (self , name , canvas , x , y , guiEvent = None ):
1300
1306
super ().__init__ (name , canvas , guiEvent = guiEvent )
@@ -1308,7 +1314,6 @@ def __init__(self, name, canvas, x, y, guiEvent=None):
1308
1314
1309
1315
if x is None or y is None :
1310
1316
# cannot check if event was in Axes if no (x, y) info
1311
- self ._update_enter_leave ()
1312
1317
return
1313
1318
1314
1319
if self .canvas .mouse_grabber is None :
@@ -1326,34 +1331,6 @@ def __init__(self, name, canvas, x, y, guiEvent=None):
1326
1331
self .xdata = xdata
1327
1332
self .ydata = ydata
1328
1333
1329
- self ._update_enter_leave ()
1330
-
1331
- def _update_enter_leave (self ):
1332
- """Process the figure/axes enter leave events."""
1333
- if LocationEvent .lastevent is not None :
1334
- last = LocationEvent .lastevent
1335
- if last .inaxes != self .inaxes :
1336
- # process Axes enter/leave events
1337
- try :
1338
- if last .inaxes is not None :
1339
- last .canvas .callbacks .process ('axes_leave_event' , last )
1340
- except Exception :
1341
- pass
1342
- # See ticket 2901582.
1343
- # I think this is a valid exception to the rule
1344
- # against catching all exceptions; if anything goes
1345
- # wrong, we simply want to move on and process the
1346
- # current event.
1347
- if self .inaxes is not None :
1348
- self .canvas .callbacks .process ('axes_enter_event' , self )
1349
-
1350
- else :
1351
- # process a figure enter event
1352
- if self .inaxes is not None :
1353
- self .canvas .callbacks .process ('axes_enter_event' , self )
1354
-
1355
- LocationEvent .lastevent = self
1356
-
1357
1334
1358
1335
class MouseButton (IntEnum ):
1359
1336
LEFT = 1
@@ -1375,11 +1352,15 @@ class MouseEvent(LocationEvent):
1375
1352
----------
1376
1353
button : None or `MouseButton` or {'up', 'down'}
1377
1354
The button pressed. 'up' and 'down' are used for scroll events.
1355
+
1378
1356
Note that LEFT and RIGHT actually refer to the "primary" and
1379
1357
"secondary" buttons, i.e. if the user inverts their left and right
1380
1358
buttons ("left-handed setting") then the LEFT button will be the one
1381
1359
physically on the right.
1382
1360
1361
+ If this is unset, *name* is "scroll_event", and *step* is nonzero, then
1362
+ this will be set to "up" or "down" depending on the sign of *step*.
1363
+
1383
1364
key : None or str
1384
1365
The key pressed when the mouse event triggered, e.g. 'shift'.
1385
1366
See `KeyEvent`.
@@ -1411,17 +1392,19 @@ def on_press(event):
1411
1392
1412
1393
def __init__ (self , name , canvas , x , y , button = None , key = None ,
1413
1394
step = 0 , dblclick = False , guiEvent = None ):
1395
+ super ().__init__ (name , canvas , x , y , guiEvent = guiEvent )
1414
1396
if button in MouseButton .__members__ .values ():
1415
1397
button = MouseButton (button )
1398
+ if name == "scroll_event" and button is None :
1399
+ if step > 0 :
1400
+ button = "up"
1401
+ elif step < 0 :
1402
+ button = "down"
1416
1403
self .button = button
1417
1404
self .key = key
1418
1405
self .step = step
1419
1406
self .dblclick = dblclick
1420
1407
1421
- # super-init is deferred to the end because it calls back on
1422
- # 'axes_enter_event', which requires a fully initialized event.
1423
- super ().__init__ (name , canvas , x , y , guiEvent = guiEvent )
1424
-
1425
1408
def __str__ (self ):
1426
1409
return (f"{ self .name } : "
1427
1410
f"xy=({ self .x } , { self .y } ) xydata=({ self .xdata } , { self .ydata } ) "
@@ -1467,8 +1450,11 @@ def on_pick(event):
1467
1450
1468
1451
cid = fig.canvas.mpl_connect('pick_event', on_pick)
1469
1452
"""
1453
+
1470
1454
def __init__ (self , name , canvas , mouseevent , artist ,
1471
1455
guiEvent = None , ** kwargs ):
1456
+ if guiEvent is None :
1457
+ guiEvent = mouseevent .guiEvent
1472
1458
super ().__init__ (name , canvas , guiEvent )
1473
1459
self .mouseevent = mouseevent
1474
1460
self .artist = artist
@@ -1506,10 +1492,46 @@ def on_key(event):
1506
1492
1507
1493
cid = fig.canvas.mpl_connect('key_press_event', on_key)
1508
1494
"""
1495
+
1509
1496
def __init__ (self , name , canvas , key , x = 0 , y = 0 , guiEvent = None ):
1510
- self .key = key
1511
- # super-init deferred to the end: callback errors if called before
1512
1497
super ().__init__ (name , canvas , x , y , guiEvent = guiEvent )
1498
+ self .key = key
1499
+
1500
+
1501
+ # Default callback for key events.
1502
+ def _key_handler (event ):
1503
+ # Dead reckoning of key.
1504
+ if event .name == "key_press_event" :
1505
+ event .canvas ._key = event .key
1506
+ elif event .name == "key_release_event" :
1507
+ event .canvas ._key = None
1508
+
1509
+
1510
+ # Default callback for mouse events.
1511
+ def _mouse_handler (event ):
1512
+ # Dead-reckoning of button and key.
1513
+ if event .name == "button_press_event" :
1514
+ event .canvas ._button = event .button
1515
+ elif event .name == "button_release_event" :
1516
+ event .canvas ._button = None
1517
+ elif event .name == "motion_notify_event" and event .button is None :
1518
+ event .button = event .canvas ._button
1519
+ if event .key is None :
1520
+ event .key = event .canvas ._key
1521
+ # Emit axes_enter/axes_leave.
1522
+ if event .name == "motion_notify_event" :
1523
+ last = LocationEvent .lastevent
1524
+ last_axes = last .inaxes if last is not None else None
1525
+ if last_axes != event .inaxes :
1526
+ if last_axes is not None :
1527
+ try :
1528
+ last .canvas .callbacks .process ("axes_leave_event" , last )
1529
+ except Exception :
1530
+ pass # The last canvas may already have been torn down.
1531
+ if event .inaxes is not None :
1532
+ event .canvas .callbacks .process ("axes_enter_event" , event )
1533
+ LocationEvent .lastevent = (
1534
+ None if event .name == "figure_leave_event" else event )
1513
1535
1514
1536
1515
1537
def _get_renderer (figure , print_method = None ):
@@ -1720,12 +1742,16 @@ def resize(self, w, h):
1720
1742
_api .warn_deprecated ("3.6" , name = "resize" , obj_type = "method" ,
1721
1743
alternative = "FigureManagerBase.resize" )
1722
1744
1745
+ @_api .deprecated ("3.6" , alternative = (
1746
+ "callbacks.process('draw_event', DrawEvent(...))" ))
1723
1747
def draw_event (self , renderer ):
1724
1748
"""Pass a `DrawEvent` to all functions connected to ``draw_event``."""
1725
1749
s = 'draw_event'
1726
1750
event = DrawEvent (s , self , renderer )
1727
1751
self .callbacks .process (s , event )
1728
1752
1753
+ @_api .deprecated ("3.6" , alternative = (
1754
+ "callbacks.process('resize_event', ResizeEvent(...))" ))
1729
1755
def resize_event (self ):
1730
1756
"""
1731
1757
Pass a `ResizeEvent` to all functions connected to ``resize_event``.
@@ -1735,6 +1761,8 @@ def resize_event(self):
1735
1761
self .callbacks .process (s , event )
1736
1762
self .draw_idle ()
1737
1763
1764
+ @_api .deprecated ("3.6" , alternative = (
1765
+ "callbacks.process('close_event', CloseEvent(...))" ))
1738
1766
def close_event (self , guiEvent = None ):
1739
1767
"""
1740
1768
Pass a `CloseEvent` to all functions connected to ``close_event``.
@@ -1751,6 +1779,8 @@ def close_event(self, guiEvent=None):
1751
1779
# AttributeError occurs on OSX with qt4agg upon exiting
1752
1780
# with an open window; 'callbacks' attribute no longer exists.
1753
1781
1782
+ @_api .deprecated ("3.6" , alternative = (
1783
+ "callbacks.process('key_press_event', KeyEvent(...))" ))
1754
1784
def key_press_event (self , key , guiEvent = None ):
1755
1785
"""
1756
1786
Pass a `KeyEvent` to all functions connected to ``key_press_event``.
@@ -1761,6 +1791,8 @@ def key_press_event(self, key, guiEvent=None):
1761
1791
s , self , key , self ._lastx , self ._lasty , guiEvent = guiEvent )
1762
1792
self .callbacks .process (s , event )
1763
1793
1794
+ @_api .deprecated ("3.6" , alternative = (
1795
+ "callbacks.process('key_release_event', KeyEvent(...))" ))
1764
1796
def key_release_event (self , key , guiEvent = None ):
1765
1797
"""
1766
1798
Pass a `KeyEvent` to all functions connected to ``key_release_event``.
@@ -1771,6 +1803,8 @@ def key_release_event(self, key, guiEvent=None):
1771
1803
self .callbacks .process (s , event )
1772
1804
self ._key = None
1773
1805
1806
+ @_api .deprecated ("3.6" , alternative = (
1807
+ "callbacks.process('pick_event', PickEvent(...))" ))
1774
1808
def pick_event (self , mouseevent , artist , ** kwargs ):
1775
1809
"""
1776
1810
Callback processing for pick events.
@@ -1787,6 +1821,8 @@ def pick_event(self, mouseevent, artist, **kwargs):
1787
1821
** kwargs )
1788
1822
self .callbacks .process (s , event )
1789
1823
1824
+ @_api .deprecated ("3.6" , alternative = (
1825
+ "callbacks.process('scroll_event', MouseEvent(...))" ))
1790
1826
def scroll_event (self , x , y , step , guiEvent = None ):
1791
1827
"""
1792
1828
Callback processing for scroll events.
@@ -1807,6 +1843,8 @@ def scroll_event(self, x, y, step, guiEvent=None):
1807
1843
step = step , guiEvent = guiEvent )
1808
1844
self .callbacks .process (s , mouseevent )
1809
1845
1846
+ @_api .deprecated ("3.6" , alternative = (
1847
+ "callbacks.process('button_press_event', MouseEvent(...))" ))
1810
1848
def button_press_event (self , x , y , button , dblclick = False , guiEvent = None ):
1811
1849
"""
1812
1850
Callback processing for mouse button press events.
@@ -1824,6 +1862,8 @@ def button_press_event(self, x, y, button, dblclick=False, guiEvent=None):
1824
1862
dblclick = dblclick , guiEvent = guiEvent )
1825
1863
self .callbacks .process (s , mouseevent )
1826
1864
1865
+ @_api .deprecated ("3.6" , alternative = (
1866
+ "callbacks.process('button_release_event', MouseEvent(...))" ))
1827
1867
def button_release_event (self , x , y , button , guiEvent = None ):
1828
1868
"""
1829
1869
Callback processing for mouse button release events.
@@ -1848,6 +1888,9 @@ def button_release_event(self, x, y, button, guiEvent=None):
1848
1888
self .callbacks .process (s , event )
1849
1889
self ._button = None
1850
1890
1891
+ # Also remove _lastx, _lasty when this goes away.
1892
+ @_api .deprecated ("3.6" , alternative = (
1893
+ "callbacks.process('motion_notify_event', MouseEvent(...))" ))
1851
1894
def motion_notify_event (self , x , y , guiEvent = None ):
1852
1895
"""
1853
1896
Callback processing for mouse movement events.
@@ -1873,6 +1916,8 @@ def motion_notify_event(self, x, y, guiEvent=None):
1873
1916
guiEvent = guiEvent )
1874
1917
self .callbacks .process (s , event )
1875
1918
1919
+ @_api .deprecated ("3.6" , alternative = (
1920
+ "callbacks.process('leave_notify_event', LocationEvent(...))" ))
1876
1921
def leave_notify_event (self , guiEvent = None ):
1877
1922
"""
1878
1923
Callback processing for the mouse cursor leaving the canvas.
@@ -1889,6 +1934,8 @@ def leave_notify_event(self, guiEvent=None):
1889
1934
LocationEvent .lastevent = None
1890
1935
self ._lastx , self ._lasty = None , None
1891
1936
1937
+ @_api .deprecated ("3.6" , alternative = (
1938
+ "callbacks.process('enter_notify_event', LocationEvent(...))" ))
1892
1939
def enter_notify_event (self , guiEvent = None , xy = None ):
1893
1940
"""
1894
1941
Callback processing for the mouse cursor entering the canvas.
0 commit comments