> Have you tried reproducing it on other Unstable boxes?
I've now reproduced it on another unstable box (powerpc
> Do you have a minimal (20-line) testcase so others can run
> and verify if the problem exists?
To reproduce the problem, I tried creating a version of the basictreeview example from
the tutorial that allowed you to delete the selected rows. Removing the last row
doesn't crash the program. However, hitting "delete" once the view is empty does
segfault on my debian unstable box.
I'm guessing my original app somehow calls this when deleting the last row -- I'll
check later to make sure. In the mean time, this example (slightly modified from the
tutorial example) does seem to point to a bug somewhere.
The culprit is treeview.get_selection().get_selected_rows() called with an empty
treeview. Running the attached tvsegfault.py (which does nothing more than set up an
empty treeview and call get_selected_rows) will quickly confirm if the segfault is
reproducible on other systems.
Tom
(p.s. apologies for messing up threading with this message -- my regular computer is
temporarily out of commission so I don't have access to the original e-mail to reply
to).
----
Please contribute to my online collaborative literature at
http://tommyrot.arrr.net/qwiki/
----
#!/usr/bin/env python
# example basictreeview.py
import pygtk
pygtk.require('2.0')
import gtk
class BasicTreeViewExample:
# Close the window and quit
def delete_event(self, widget, event, data=None):
gtk.main_quit()
return gtk.FALSE
def __init__(self):
# Create a new window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("Basic TreeView Example")
self.window.set_size_request(200, 200)
self.window.connect("delete_event", self.delete_event)
# create a TreeStore with one string column to use as the model
self.treestore = gtk.TreeStore(str)
# we'll add some data now - 4 rows with 3 child rows each
for parent in range(4):
piter = self.treestore.append(None, ['parent %i' % parent])
for child in range(3):
self.treestore.append(piter, ['child %i of parent %i' %
(child, parent)])
# create the TreeView using treestore
self.treeview = gtk.TreeView(self.treestore)
# allow multiple selections
self.treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
# create the TreeViewColumn to display the data
self.tvcolumn = gtk.TreeViewColumn('Column 0')
# add tvcolumn to treeview
self.treeview.append_column(self.tvcolumn)
# create a CellRendererText to render the data
self.cell = gtk.CellRendererText()
# add the cell to the tvcolumn and allow it to expand
self.tvcolumn.pack_start(self.cell, True)
# set the cell "text" attribute to column 0 - retrieve text
# from that column in treestore
self.tvcolumn.add_attribute(self.cell, 'text', 0)
# make it searchable
self.treeview.set_search_column(0)
# Allow sorting on the column
self.tvcolumn.set_sort_column_id(0)
# Allow drag and drop reordering of rows
self.treeview.set_reorderable(True)
# Create delete button
self.deleteB = gtk.Button("Delete Selected Rows")
self.deleteB.connect('clicked',self.delete_rows)
self.vbox = gtk.VBox()
self.vbox.add(self.treeview)
self.vbox.add(self.deleteB)
self.window.add(self.vbox)
self.window.show_all()
def delete_rows (self, *args):
print 'delete_rows called'
treestore,paths=self.treeview.get_selection().get_selected_rows()
print 'got selected rows...'
paths.reverse()
for path in paths:
print 'removing iter@',path
iter = treestore.get_iter(path)
treestore.remove(iter)
def main():
gtk.main()
if __name__ == "__main__":
tvexample = BasicTreeViewExample()
main()
#!/usr/bin/env python
# segfaulting example, quickndirty
import pygtk
pygtk.require('2.0')
import gtk
# create a TreeStore with one string column to use as the model
treestore = gtk.TreeStore(str)
treeview = gtk.TreeView(treestore)
treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
treestore,paths=treeview.get_selection().get_selected_rows()
_______________________________________________
pygtk mailing list [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/