> 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/

Reply via email to