Canvas with scrollbars - how to get correct canvas coordinate when the scroll bars have moved?

Eric Brunel eric_brunel at
Mon Oct 25 10:16:09 CEST 2004

PhilC wrote:
> Hi Folks,
> I'm trying to click on a canvas to draw a line. The canvas has scroll
> bars. All is well until I move the scrollbars. This naturally because
> the relationship between my screen click and canvas event.x, event.y
> has changed.
> I need something that will add the proportional amount the scroll bar
> has moved to the mouse click position. I see the terms canvasx and
> canvasy but they appear to be used for converting screen position to
> canvas position.

Either I do not understand your question, or canvasx and canvasy are exactly 
what you're looking for:

from Tkinter import *

root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
cnv = Canvas(root, scrollregion=(0, 0, 1000, 1000))
cnv.grid(row=0, column=0, sticky='nswe')
hs = Scrollbar(root, orient=HORIZONTAL, command=cnv.xview)
hs.grid(row=1, column=0, sticky='we')
vs = Scrollbar(root, orient=VERTICAL, command=cnv.yview)
vs.grid(row=0, column=1, sticky='ns')
cnv.configure(xscrollcommand=hs.set, yscrollcommand=vs.set)

def click(evt):
   x, y = cnv.canvasx(evt.x), cnv.canvasy(evt.y)
   cnv.create_oval(x - 5, y - 5, x + 5, y + 5)

cnv.bind('<1>', click)


"Canvas position" is the position in the drawable zone for the canvas, 
considering the scroll-region. Isn't it what you want?

- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools -

More information about the Python-list mailing list