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