@@ -251,68 +251,53 @@ def get_tk_widget(self):
251251 """
252252 return self ._tkcanvas
253253
254+ def _event_mpl_coords (self , event ):
255+ # calling canvasx/canvasy allows taking scrollbars into account (i.e.
256+ # the top of the widget may have been scrolled out of view).
257+ return (self ._tkcanvas .canvasx (event .x ),
258+ # flipy so y=0 is bottom of canvas
259+ self .figure .bbox .height - self ._tkcanvas .canvasy (event .y ))
260+
254261 def motion_notify_event (self , event ):
255- x = event .x
256- # flipy so y=0 is bottom of canvas
257- y = self .figure .bbox .height - event .y
258- super ().motion_notify_event (x , y , guiEvent = event )
262+ super ().motion_notify_event (
263+ * self ._event_mpl_coords (event ), guiEvent = event )
259264
260265 def enter_notify_event (self , event ):
261- x = event .x
262- # flipy so y=0 is bottom of canvas
263- y = self .figure .bbox .height - event .y
264- super ().enter_notify_event (guiEvent = event , xy = (x , y ))
266+ super ().enter_notify_event (
267+ guiEvent = event , xy = self ._event_mpl_coords (event ))
265268
266269 def button_press_event (self , event , dblclick = False ):
267- x = event .x
268- # flipy so y=0 is bottom of canvas
269- y = self .figure .bbox .height - event .y
270270 num = getattr (event , 'num' , None )
271-
272- if sys .platform == 'darwin' :
273- # 2 and 3 were reversed on the OSX platform I tested under tkagg.
274- if num == 2 :
275- num = 3
276- elif num == 3 :
277- num = 2
278-
279- super ().button_press_event (x , y , num ,
280- dblclick = dblclick , guiEvent = event )
271+ if sys .platform == 'darwin' : # 2 and 3 are reversed.
272+ num = {2 : 3 , 3 : 2 }.get (num , num )
273+ super ().button_press_event (
274+ * self ._event_mpl_coords (event ), num , dblclick = dblclick ,
275+ guiEvent = event )
281276
282277 def button_dblclick_event (self , event ):
283278 self .button_press_event (event , dblclick = True )
284279
285280 def button_release_event (self , event ):
286- x = event .x
287- # flipy so y=0 is bottom of canvas
288- y = self .figure .bbox .height - event .y
289-
290281 num = getattr (event , 'num' , None )
291-
292- if sys .platform == 'darwin' :
293- # 2 and 3 were reversed on the OSX platform I tested under tkagg.
294- if num == 2 :
295- num = 3
296- elif num == 3 :
297- num = 2
298-
299- super ().button_release_event (x , y , num , guiEvent = event )
282+ if sys .platform == 'darwin' : # 2 and 3 are reversed.
283+ num = {2 : 3 , 3 : 2 }.get (num , num )
284+ super ().button_release_event (
285+ * self ._event_mpl_coords (event ), num , guiEvent = event )
300286
301287 def scroll_event (self , event ):
302- x = event .x
303- y = self .figure .bbox .height - event .y
304288 num = getattr (event , 'num' , None )
305289 step = 1 if num == 4 else - 1 if num == 5 else 0
306- super ().scroll_event (x , y , step , guiEvent = event )
290+ super ().scroll_event (
291+ * self ._event_mpl_coords (event ), step , guiEvent = event )
307292
308293 def scroll_event_windows (self , event ):
309294 """MouseWheel event processor"""
310295 # need to find the window that contains the mouse
311296 w = event .widget .winfo_containing (event .x_root , event .y_root )
312297 if w == self ._tkcanvas :
313- x = event .x_root - w .winfo_rootx ()
314- y = event . y_root - w . winfo_rooty ()
315- y = self .figure . bbox . height - y
298+ x = self . _tkcanvas . canvasx ( event .x_root - w .winfo_rootx () )
299+ y = ( self . figure . bbox . height
300+ - self ._tkcanvas . canvasy ( event . y_root - w . winfo_rooty ()))
316301 step = event .delta / 120.
317302 FigureCanvasBase .scroll_event (self , x , y , step , guiEvent = event )
318303
0 commit comments