On Tue, 01 Aug 2006 14:14:51 +0200, H J van Rooyen <[EMAIL PROTECTED]> 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+-'])" -- http://mail.python.org/mailman/listinfo/python-list