Python PyGOobject树视图:使用Tab键移动单元格后确认编辑

1 投票
2 回答
563 浏览
提问于 2025-04-17 19:37

经过长时间的搜索,我找到了一种解决办法(其实很简单),可以在树形视图的网格中使用Tab键在单元格之间移动,同时保持单元格处于编辑状态。

现在我遇到了一个问题:单元格的编辑确认只有在按下Enter键后才会发生。如果我按Tab键,就会触发一个编辑取消的事件。

该怎么解决呢?怎么才能让按Tab键时也能确认数据呢?

这是我处理树形视图按键事件的代码:

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

谢谢大家!!!!

2 个回答

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 提供的这个漂亮的黑科技!

问候大家。

0

我知道这个讨论已经很久了。我用现在的Python3和Gtk3版本试了你的代码,但它不管用。它只对新添加的行有效。对于已经存在的行,按Tab键无法跳到下一个单元格。如果我加上“return True”,那么所有单元格都可以用Tab键跳转,即使是已有的单元格,但这样的话,内容都不会更新。

撰写回答