Fix for a Tktable bug....

jerry.levan at gmail.com jerry.levan at gmail.com
Tue Jul 11 17:22:38 EDT 2006


jerry.levan at gmail.com wrote:
> jerry.levan at gmail.com wrote:
> > Hi,
> > I have a Tktable object (self.table) and when I click on a row the
> > whole row is selected.
> >
> > If I click of a button to get the row contents then
> >
> > self.table.curselection() fails with a traceback of:
> >
> > Traceback (most recent call last):
> >   File
> > "/Library/Frameworks/Python.framework/Versions/2.4//lib/python2.4/lib-tk/Tkinter.py",
> > line 1345, in __call__
> >     return self.func(*args)
> >   File "/Users/jerry/python/PyPgExplorerUni/Resources/editor.py", line
> > 159, in deleteRow
> >     print self.table.curselection()
> >   File
> > "/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/Tktable.py",
> > line 139, in curselection
> >     return self._getCells(self.tk.call(self._w, 'curselection'))
> >   File
> > "/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/Tktable.py",
> > line 106, in _getCells
> >     for i in string.split(cellString):
> >   File
> > "/Library/Frameworks/Python.framework/Versions/2.4//lib/python2.4/string.py",
> > line 292, in split
> >     return s.split(sep, maxsplit)
> > AttributeError: 'tuple' object has no attribute 'split'
> >
> > It is my reading that curselection will return the indices of the
> > selected cells...
> >
> > Help,
> >
> > Jerry
>
> looking into Tktable the curselection function is defined by:
>
>     def curselection(self, setValue = None):
> 		if setValue != None:
> 			self.tk.call(self._w, 'curselection', 'set', setValue)
> 		else:
> 			return self._getCells(self.tk.call(self._w, 'curselection'))
>
> looking at getCells we see:
>
>     def _getCells(self, cellString):
>               #JHL
>               print cellString
> 		res = []
> 		for i in string.split(cellString):
> 			res.append(tuple(map(int, string.split(i, ','))))
> 		return res
>
> When I run my program and select a row the value of cellString is
>
>        ('3,0', '3,1', '3,2', '3,3', '3,4', '3,5', '3,6')
>
> Which is the correct results...( ie the "fourth" row is selected and
> there are six
> columns...
>
> Unfortunately the above is *not* a string and hence the "for" statement
> fails.
>
> It is hard to believe that I am the first person to attempt to retrieve
> a selection
> from a Tktable object....
>
> Am I overlooking something obvious?
>
> Jerry

I think I have found a bug in the Tktable.py wrapper.

It appears that if a row is selected in a Tktable (in Python)
then any attempt to fetch the selection with curselection
fails when a string operation is performed on a "tuple"

the relevant routines in Tktable.py are:


   def curselection(self, setValue = None):
		if setValue != None:
			self.tk.call(self._w, 'curselection', 'set', setValue)
		else:
			return self._getCells(self.tk.call(self._w, 'curselection'))

curselection will call _getCells

    def _getCells(self, cellString):
		res = []
                #JHL
                if type(cellString) == type(()) : return cellString
		for i in string.split(cellString):
			res.append(tuple(map(int, string.split(i, ','))))
		return res

I added the "if type( ...." line to prevent the error.

If a table row is selected cellString will look like

('3,0', '3,1', '3,2', '3,3', '3,4', '3,5', '3,6')

which is of type "tuple" which fails the string.split command ;(

I suspect it is probably best to just short circuit the call to
_getCells.

The following routine (with the above patch )will correctly retrieve
the contents
of a selected row.

   def deleteRow(self):
        res = self.table.curselection()
        for index in res :
            print self.table.get(index)

Tain't clear to me where this should be reported

Jerry




More information about the Python-list mailing list