Hi --
a) Assume I would have some different widgets to add per row. How
do I get the maximum row height?
If you are placing widgets in a table like this:
w.grid(row=a, column=b)
... where the *master* of widget "w" is a Tkinter.Frame named
"table_frm", then you can determine the height of row N like this:
table_frm.grid_bbox(column=0, row=N)
Quoth the grid_bbox() documentation (with the object name changed for
clarity):
Returns a 4-tuple describing the bounding box of some or all
of the grid system in widget |/|table_frm|/|. The first two numbers
returned
are the /|x|/ and /|y|/ coordinates of the upper left corner of the
area,
and the second two numbers are the width and height.
So the final member of the 4-tuple is the height you want.
b) Assume something like a label in one column. The length of all
texts
in a column will differ. How do I choose the maxium column width?
The third member of grid_bbox() 4-tuple is the cell-width. So just find
the maximum of these values:
table_frm.grid_bbox(column=0, row=0)[2]
table_frm.grid_bbox(column=1, row=0)[2]
table_frm.grid_bbox(column=2, row=0)[2]
...
c) Placing headers in a canvas does not look like a good idea because
I don't want to scroll the headers. Am I right?
c.1) How do I place a none scrollable header in a canvas? or
c.2) How do I place all headers outside the canvas correctly above
the relating column?
"c.2" is what you want. Again, if the table is in a Tkinter.Frame named
"frm", you want to create an outer frame, then pack a header frame and
the table frame into it, vertically:
rt = Tk()
outer_frm = Frame(rt)
outer_frm.pack(expand=True, fill=BOTH)
header_frm = Frame(outer_frm, height=25)
header_frm.pack(side=TOP)
table_frm = Frame(outer_frm)
table_frm.pack(side=TOP)
(For scrolling, consider making "table_frm" a Pmw.ScrolledFrame instead
of a Tkinter.Frame.)
As for getting the heading labels correctly placed above the columns,
pack correctly-sized subframes (Tkinter.Frame's) into "header_frm". To
determine the size of a column, use grid_bbox() again:
BBOX_WIDTH_COMPONENT = 2
header_subfrm = Frame(header_frm, relief=GROOVE, bd=2)
header_subfrm['width'] = \
table_frm.grid_bbox(column=N, row=0)[BBOX_WIDTH_COMPONENT]
Then, use place() to center a label within the subframe:
header_label = Label(header_subfrm, text="Heading")
header_label.place(relx=0.5, rely=0.5, anchor=CENTER)
There's a working app at http://cl1p.net/tkinter_table_headers/
-John
--
http://mail.python.org/mailman/listinfo/python-list