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