Strange Tkinter Grid behaviour Problem

Peter Otten __peter__ at web.de
Tue Aug 1 08:44:10 EDT 2006


H J van Rooyen 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.
> I found the 'nsew' form by trial and error...
> 
> self.disp is a window different from the current one - it is used to
> display a record entry as it is built up field by field. - the code
> fragment above is what inserts the description of the entry and the
> entered data in a row in the window used for displaying, when the user
> hits the enter key.
> 
> Is this a bug, or am I still doing something wrong?

You have probably defined your own, say, E somewhere in your module:

E = ... # whatever

This can easily be fixed by using another name. But what you are really
doing wrong is using the 

from Tkinter import *

star-import which drastically increases the likelihood of such name clashes.
I recommend using qualified names, abbreviated if you like:

import Tkinter as tk

... tk.N + tk.S + tk.E + tk.W ... # a bit longer, but worth the effort

Of course this could still go wrong if you do

tk = 42 

somewhere in your module...

Peter



More information about the Python-list mailing list