Strange Tkinter Grid behaviour Problem

Eric Brunel eric_brunel at despammed.com
Tue Aug 1 08:56:03 EDT 2006


On Tue, 01 Aug 2006 14:14:51 +0200, H J van Rooyen <mail at microcorp.co.za>  
wrote:

> Hi,
>
> Still struggling with my GUI exercise -
>
> I have the following lines of code in a routine that is bound at  
> <Key-Return> to
> an instance of Entry :
>
>         self.disp.Amount_des = Label(self.disp, text = self.dis_string,  
> fg =
> 'black', bg = 'yellow')
>         self.disp.Amount_des.grid(row = self.rownum, column=0, sticky =  
> 'nesw')
>
>         self.disp.Amount = Label(self.disp, text = self.retstring, fg =  
> 'black',
> bg = 'green')
>         self.disp.Amount.grid(row = self.rownum, column=1, sticky =  
> N+S+E+W)
>
> The second call to the grid method fails as follows:
>
> Exception in Tkinter callback
> Traceback (most recent call last):
>   File "E:\PYTHON24\lib\lib-tk\Tkinter.py", line 1345, in __call__
>     return self.func(*args)
>   File "C:\WINDOWS\DESKTOP\Entry1.py", line 243, in entryend
>     self.disp.Amount.grid(row = self.rownum, column=1, sticky = N+S+E+W)
> TypeError: cannot concatenate 'str' and 'instance' objects
>
> If I change the N+S+E+W to the 'nsew' form, it works no problem...
>
> Weird - at other places in the program the form:  sticky = N+S+E+W works  
> without
> a problem.

Simple: you have in this context a local or global variable named either  
N, S, W or E, shadowing the constant defined in the Tkinter module. You  
can find it by inserting a line like:

print repr(N), repr(S), repr(W), repr(E)

before your self.disp.Amount.grid in your code. This line should print:

'n' 's' 'w' 'e'

but I guess it won't...

The solutions are:
- Rename your variable.
- Always use the string form, i.e 'nswe'. This is the standard in native  
tk. The N, S, W and E constants are just defined for convenience in  
Tkinter.
- Do not use "from Tkinter import *" to import the module, but something  
like "import Tkinter as tk", and then prefix all names in this module by  
'tk.'. So your code above becomes:

self.disp.Amount = tk.Label(self.disp, text = self.retstring, fg =   
'black', bg = 'green')
self.disp.Amount.grid(row = self.rownum, column=1, sticky =  
tk.N+tk.S+tk.E+tk.W)

(I'm personnally not a big fan of this last solution, since I find it  
clobbers the code a lot and decreases readability. But it's usually the  
best way to avoid name clashes...)

[snip]

HTH
-- 
python -c "print ''.join([chr(154 - ord(c)) for c in  
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"



More information about the Python-list mailing list