在搜索了很长时间后,我发现了一个解决方案(非常简单),可以使用Tab键在树视图网格的单元格之间移动,并在编辑模式下保留单元格。
现在我遇到了一个问题:只有在按下Enter键后才能进行单元格编辑确认。 如果按Tab键,则会触发editing_canceled事件。
如何解决?如何在标签键按下时允许数据确认?
这是我的treeview key-press-event的事件处理程序:
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
感谢所有!!!!
答案 0 :(得分:1)
一个伟大的人找到了一个解决方案:从gobject超时调用set_cursor方法!!!
我将它从pygtk移植到pygobject,我在之前的方法帖子中进行了调整。
所以,对于所有需要它的人,代码:
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
非常感谢Jordan Callicoat这些美丽的黑客行为!
问候。
答案 1 :(得分:0)
我知道这个帖子很久以前了。我用当前版本的Python3和Gtk3尝试了你的代码并且不起作用。它仅适用于新行。现有行不会标记到下一个单元格。如果我添加“return True”,那么每个单元格都可以使用现有单元格Tab,但不会更新。