Tkinter measurements

Eric Brunel eric_brunel at despammed.com
Tue Sep 28 10:26:01 CEST 2004


John Velman wrote:
> I want to draw a box around a short piece of text in canvas (one line
> text).  I know how to do it if I place the text on the canvas first,then
> draw the box around it. 
> 
> Is there a way to find out the dimensions of the text bounding box before
> drawing it?

First: why do you want to do that? The most used method is to draw the text 
before, get its bounding box, then draw the box. Why do you want to do the opposite?

Anyway, there are some ways to get the size of the displayed text via the tkFont 
module. Example:

--------------------------------------------------------------
from Tkinter import *
from tkFont import Font

root = Tk()
cnv = Canvas(root)
cnv.pack()

## This text item is only used to get the default font in the canvas
t = cnv.create_text(0, 0, text='')
f = Font(font=cnv.itemcget(t, 'font'))

s = 'spam, spam and spam'
cnv.create_text(10, 10, text=s, anchor=W)
cnv.create_line(10, 15, 10 + f.measure(s), 15)

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

So you can get the text width quite easily. For the text height, it only depends 
on the font size and the number of lines in the text, so computing it "manually" 
seems reasonable.

> Also, is there a method for converting from pixels to inches or inches to
> pixels (for canvas)?

The solution I use is just to multiply or divide by 72. Be careful with that: if 
you use it on font sizes, some windowing systems try to be smart and consider 
the screen resolution when displaying text. To avoid this, you can use negative 
font sizes (e.g. myText.configure(font=('helvetica', -12))). A negative font 
size is always considered in "regular" pixels (one inch / 72), and does not 
depend on the screen resolution.

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




More information about the Python-list mailing list