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/