Can't Get A Selection from Tktable...

J

jerry.levan

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
 
J

jerry.levan

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
 
J

jerry.levan

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
 
J

jerry.levan

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top