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

PhilC pcooke at
Mon Oct 25 13:57:57 CEST 2004

Thanks Eric,

I thought so too :)

Re looked at my script and I had an error further down. Corrected that
and the scrolling all works. Part of my inexperience is not knowing
where to look for the errors. I'm sure that comes with practice.

Many thanks for taking the time to answer me it is much appreciated.



On Mon, 25 Oct 2004 10:16:09 +0200, Eric Brunel
<eric_brunel at> wrote:

>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?

More information about the Python-list mailing list