Python PyGOobject treeview: confirmar edición después de moverse entre celdas con la tecla Tab

Después de buscar durante mucho tiempo, encontré una solución (bastante simple) para moverme entre las celdas de una cuadrícula de vista de árbol usando la tecla Tab y manteniendo las celdas en el modo de edición.

Ahora tengo un problema: la confirmación de edición de celda solo ocurre después de presionar la tecla Intro. Si presiono la tecla Tab, aparece un evento editing_canceled que se activa.

¿Cómo resolverlo? ¿Cómo permitir la confirmación de los datos también pulsando la tecla tabulador?

Este es mi controlador de eventos para la visualización de pulsaciones de teclas con vista de árbol:

def key_tree_Tab(self, treeview, event,namewidget): path, col = treeview.get_cursor() ## only visible columns!! columns = [c for c in treeview.get_columns() if c.get_visible()] colnum = columns.index(col) if event.keyval==65289: if colnum + 1 < len(columns): next_column = columns[colnum + 1] treeview.set_cursor(path,next_column,start_editing=True) else: tmodel = treeview.get_model() titer = tmodel.iter_next(tmodel.get_iter(path)) if titer is None: titer = tmodel.get_iter_first() path = tmodel.get_path(titer) next_column = columns[0] treeview.set_cursor(path,next_column,start_editing=True) return True 

¡¡¡¡Gracias a todos!!!!

Sé que este hilo es hace mucho tiempo. Probé tu código con la versión actual de Python3 y Gtk3 y no funciona. Funciona solo con nuevas filas. Las filas existentes no se tabulan a la siguiente celda. Si agrego “devolver verdadero”, entonces todas las celdas pueden hacer tabulaciones incluso con celdas existentes, pero ninguna se actualiza.

Una gran persona encontró una solución: ¡llame al método set_cursor desde un tiempo de espera de objeto!

Lo transfiero de pygtk a pygobject, y lo adapto en la publicación del método anterior.

Entonces, para todos aquellos que lo necesiten, el código:

 def key_tree_Tab(self, treeview, event,namewidget): keyname = Gdk.keyval_name(event.keyval) path, col = treeview.get_cursor() ## only visible columns!! columns = [c for c in treeview.get_columns() if c.get_visible()] colnum = columns.index(col) if keyname=="Tab" or keyname=="Esc": if colnum + 1 < len(columns): next_column = columns[colnum + 1] else: tmodel = treeview.get_model() titer = tmodel.iter_next(tmodel.get_iter(path)) if titer is None: titer = tmodel.get_iter_first() path = tmodel.get_path(titer) next_column = columns[0] if keyname == 'Tab': #Thank you Jordan!!!!!! Great hack! GLib.timeout_add(50, treeview.set_cursor, path, next_column, True) elif keyname == 'Escape': pass 

Realmente gracias a Jordan Callicoat por estos hermosos trucos!

Saludos.