| FAQ Index - Search - Recent Changes - Everything - Add entry |
13.60. How do I end editing immediately after an item is selected in a CellRendererCombo?
Ending editing of a gtk.CellRendererCombo immediately after an item is selected is a two stage process.
In the first stage, you must capture the combo itself, since it is not accessible later. To capture the combo, connect to the `editing-started` gtk.CellRenderer signal. You may define the connection in Glade or create it manually in code.
In the second stage, emit a `focus-out-event` in a `changed` signal handler for gtk.CellRendererCombo.
Here is sample code to demonstrate:
import pygtk
pygtk.require('2.0')
import gtk
import gobject
class AutoEndingComboDemo(object):
def __init__():
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_size_request(500, 500)
self.window.connect('destroy', lambda w: gtk.main_quit())
self.comboModel = gtk.Liststore(gobject.TYPE_STRING)
self.comboModel.append(['Item 1'])
self.comboModel.append(['Item 2'])
self.comboModel.append(['Item 3'])
self.treeModel = gtk.Liststore(gobject.TYPE_STRING)
self.treeModel.append()
crc = gtk.CellRendererCombo()
crc.set_property('model', self.comboModel)
crc.set_property('text-column', 0)
crc.set_property('editable', True)
crc.set_property('has_entry', False)
crc.connect('changed', self.comboChanged)
crc.connect('editing-started', self.editingStarted)
crc.connect('edited', self.edited, self.treeModel, 0)
cl = gtk.TreeViewColumn('Select One', crc, text=0)
self.treeView = gtk.TreeView(self.treeModel)
treeView.append_column(cl)
self.window.add(self.treeView)
self.window.show()
self.comboEditable = None
def comboChanged(self, cell, path, newiter):
e = gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE)
e.window = self.treeView.window
e.send_event = True
e.in_ = False
self.comboEditable.emit('focus-out-event', e)
def editingStarted(self, cell, editable, path):
self.comboEditable = editable
def edited(self, cell, path, newtext, model=None, columnNumber=0):
model[path][columnNumber] = newtext
if __name__ == "__main__":
app = AutoEndingComboDemo()
gtk.main()
