[tkinter] widget size adjustment

Christian Gollwitzer auriocus at gmx.de
Wed Jun 22 17:47:30 EDT 2016

Am 22.06.16 um 23:18 schrieb Zachary Ware:
> On Wed, Jun 22, 2016 at 4:05 PM, Christian Gollwitzer <auriocus at gmx.de> wrote:
>> BTW, the Tkinter wrapper is a bit clumsy for this option. In the original
>> Tk, the sticky option is just a string. You can still pass that and do
>>         sticky='nsew'
>> instead of the clumsy
>>         sticky=Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W
> There are constants in tkinter for this: NSEW, NS, NE, NW, SE, SW, and EW.

Yes, but this means that not only the combinations with three are 
missing (NEW = stretch left-right and align at the top etc.), but also 
you need to remember the exact order that the author of Tkinter has set.

I'm still thinking that passing a string is more in the spirit of Tk; do 
sticky='snew' or sticky='news' if you wish, which actually works. Plus 
you save the module prefix (unless you do "from tkinter import *"). I'm 
not getting the rationale behind these constants. Why should I do 
side=Tk.LEFT instead of side='left' ?

There are more points where Tkinter feels clunky compared to Tk in Tcl. 
For instance, gridding widgets with row and columnspan options can be 
done in Tcl in ASCII-art using -, x and ^ to indicate extensions:

grid .a   -
grid .b   .c
grid  ^   x

This defines a 3x2 grid where .a extends to the right (columnspan=2), .b 
extends downwards (rowspan =2), and the bottom right place is empty. The 
same thing in Python requires to do explicit row/column-counting

a.grid(row=0, column=0, columnspan=2)
b.grid(row=1, column=0, rowspan=2)
c.grid(row=1, column=1)

This gets increasingly uglier with the number of widgets in a frame.
If grid were a standalone function, as it is in Tk, it would not be 
difficult to provide something similar to the Tcl code. For whatever 
reason it was decided that it should be a method of the widgets to be 
placed and thus accepts only a single widget.


More information about the Python-list mailing list