Hi.

here is a simple dialog for managing one column text only liststore.
after 3 times of adding an item without editing anything (just hitting Esc)
i got

-- [EMAIL PROTECTED] ~/work/opvo/gtk2% ./test_tv.py
./test_tv.py:73: GtkWarning: gtk_tree_model_sort_real_unref_node:
assertion `elt->ref_count > 0' failed
  self.tv.set_cursor(path, self.tvc, True)

if i continue to add/cancel items script gets segfault

pygtk is 2.8.2, gtk is 2.8.3

here is the code

#!/usr/bin/env python
# vim:fileencoding=utf-8:

import pygtk
import gobject
import gtk

class test(gtk.Dialog):
    __gsignals__ = {
        'item-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
                         (gobject.TYPE_STRING, gobject.TYPE_STRING)),
        'item-added'  : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
                         (gobject.TYPE_STRING,)),
        'item-deleted': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
                         (gobject.TYPE_STRING,))
        }

    def __init__(self, parent, size=(350,400)):
        gtk.Dialog.__init__(self, u'test', parent,
                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))

        self.store = gtk.ListStore(str)
        self.sorted = gtk.TreeModelSort(self.store)
        self.sorted.set_sort_column_id(0, gtk.SORT_ASCENDING)

        for i in range(0,5):
            self.store.append([str(i)])

        self.tv = gtk.TreeView(self.sorted)
        self.tv.set_rules_hint(True)

        renderer = gtk.CellRendererText()
        renderer.set_property('editable', True)
        renderer.connect('edited', self.edited)
        renderer.connect('editing-canceled', self.canceled)

        self.tvc = gtk.TreeViewColumn(u'a header', renderer, text=0)
        self.tv.append_column(self.tvc)

        buttons = gtk.VButtonBox()
        buttons.set_spacing(3)
        buttons.set_layout(gtk.BUTTONBOX_START)

        button = gtk.Button(stock=gtk.STOCK_ADD)
        button.set_focus_on_click(False)
        button.connect('clicked', self.addItem)
        buttons.pack_start(button, False)

        button = gtk.Button(stock=gtk.STOCK_REMOVE)
        button.set_focus_on_click(False)
        #button.connect('clicked', self.deleteItem)
        buttons.pack_start(button, False)

        frame = gtk.Frame()
        frame.set_shadow_type(gtk.SHADOW_IN)
        frame.add(self.tv)

        hbox = gtk.HBox(spacing=3)
        hbox.pack_start(frame)
        hbox.pack_start(buttons, False)

        self.vbox.pack_start(hbox)
        self.set_size_request(*size)
        self.show_all()

    def addItem(self, widget):
        # append an empty row to underlying model
        iter = self.store.append()

        # select new row and start editing it
        path = self.store.get_path(iter)
        path = self.sorted.convert_child_path_to_path(path)
        self.tv.grab_focus()
        self.tv.set_cursor(path, self.tvc, True)

    def edited(self, cell, path, new_text):
        path = self.sorted.convert_path_to_child_path(path)
        old_text = self.store[path][0]

        self.store[path][0] = unicode(new_text)
        if old_text is None:
            self.emit('item-added', new_text)
        else:
            self.emit('item-changed', old_text, new_text)

    def canceled(self, cell):
        # if row is empty (just appended) remove it from store
        if self.store[-1][0] == None:
            del self.store[-1]


dlg = test(None)
dlg.run()
dlg.destroy()

--
Yuri Pimenov
_______________________________________________
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