By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
432,414 Members | 1,024 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 432,414 IT Pros & Developers. It's quick & easy.

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

P: n/a
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.

A pointer in the right direction would be appreciated.

Thanks

PhilC
Jul 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
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)

root.mainloop()
------------------------------------------------------------

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

HTH
--
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
Jul 18 '05 #2

P: n/a
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.

Regards

Phil

On Mon, 25 Oct 2004 10:16:09 +0200, Eric Brunel
<er*********@despammed.com> 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)

root.mainloop()
------------------------------------------------------------

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

HTH


Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.