[EMAIL PROTECTED] wrote:
> [EMAIL PROTECTED] wrote:
> > [EMAIL PROTECTED] 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

It would not be any fun for my app users if I had to change the
Tktable.py
source all by myself....

Here is another fix that involves calling Tk directly

instead of :
   res = self.table.curselection()

I can do:
  res = self.root.tk.call(self.table,'curselection')

root is the app top level ( self.table works also...)

for a row  the above call will return something like
   ('2,0', '2,1', '2,2', '2,3', '2,4', '2,5', '2,6')

the "co-ordinate" strings in the above tuple can be used
as indices into the table to retreive the selection.


Jerry

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to