How do I get the fractions of the visible part of a canvas?
Eric Brunel
eric.brunel at pragmadev.com
Wed Jul 2 04:31:19 EDT 2003
Mickel Grönroos wrote:
> Hi,
>
> I have a Tkinter.Canvas of variable width. Is there a standard way of
> asking the canvas which parts of it that is visible? I.e. on the
> horizontal scale, I would like to know at what fraction from the left the
> left visibility border is and from what fraction to the right the right
> visibility border is.
>
> Consider this ascii picture as an example
>
> +-------------------------------+
> | |<-- the full canvas
> | a------------------+ |
> | | |<--------- the currently visible part
> | +------------------b |
> | |
> +-------------------------------+
>
> I would like to be able to ask the canvas something like:
>
> t = canvas.visiblebox()
>
> and it would return a two-tuple of two-tuples with coordinates (of the
> a and b points in the picture above), say:
>
> t = ((10,10), (90,30))
>
> Using these values I could calculate the fractions myself.
>
> Any ideas?
This should do what you want:
--------------------------------
from Tkinter import *
## Initialize Tk
root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
## Create the canvas
cnv = Canvas(root, scrollregion=(0, 0, 1000, 1000), width=200, height=200)
cnv.grid(row=0, column=0, sticky='nswe')
## Create the scrollbars
hs = Scrollbar(root, orient=HORIZONTAL, command=cnv.xview)
vs = Scrollbar(root, orient=VERTICAL, command=cnv.yview)
cnv.configure(xscrollcommand=hs.set, yscrollcommand=vs.set)
hs.grid(row=1, column=0, sticky='we')
vs.grid(row=0, column=1, sticky='ns')
## This is the function you want:
def showVisibleRegion():
x1, y1 = cnv.canvasx(0), cnv.canvasy(0)
w, h = cnv.winfo_width(), cnv.winfo_height()
x2, y2 = cnv.canvasx(w), cnv.canvasy(h)
print x1, y1, x2, y2
b = Button(root, text='Show', command=showVisibleRegion)
b.grid(row=2, column=0, columnspan=2)
root.mainloop()
--------------------------------
The methods canvasx and canvasy on a Canvas convert a coordinate in the
displayed canvas to a coordinate in the underlying region:
+------------------------------+
| |
| |
| +----------------------+ |
| | | |
| |<--x-->| | |
| | + | |
| | | | |
| +-------|--------------+ |
|<---xx---->| |
| |
+------------------------------+
Here, cnv.canvasx(x) = xx
So, taking the canvasx and canvasy of (0, 0) gives you the coordinates for the
top-left corner of the region you want, and taking the canvasx and canvasy of
the canvas's dimensions gives you the bottom-right one.
HTH
--
- Eric Brunel <eric.brunel at pragmadev.com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
More information about the Python-list
mailing list