Skip to content

Commit 97214e5

Browse files
authored
Merge pull request #19400 from anntzer/tksb
Fix tk event coordinates in the presence of scrollbars.
2 parents f710ad3 + dce3f09 commit 97214e5

File tree

1 file changed

+25
-40
lines changed

1 file changed

+25
-40
lines changed

lib/matplotlib/backends/_backend_tk.py

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)