Strange Tkinter Grid behaviour Problem

H J van Rooyen mail at microcorp.co.za
Wed Aug 2 01:05:12 EDT 2006


"Peter Otten" <__peter__ at web.de> wrote:
|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

Well spotted that man! the offending line was:

    def entryend(self,S):
        """This gets done on carriage return"""

The 'S" is not actually used by me - it was added because the callback passes
Something back and I got an error earlier while I was still using pack...
*grin*

This also explains why it only happens here and not elsewhere...

Problem sorted - False alarm!

- Thanks




More information about the Python-list mailing list