Python PyGOobject treeview:使用 Tab 键在单元格之间移动后确认编辑

Posted

技术标签:

【中文标题】Python PyGOobject treeview:使用 Tab 键在单元格之间移动后确认编辑【英文标题】:Python PyGOobject treeview: confirm edit after move between cells with Tab key 【发布时间】:2013-03-19 11:07:04 【问题描述】:

经过长时间的搜索,我找到了一个解决方案(非常简单),可以使用 Tab 键在树视图网格的单元格之间移动,并在编辑模式下维护单元格。

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

如何解决?如何在 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

谢谢大家!!!!

【问题讨论】:

【参考方案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 提供了这些美丽的 hack!

您好。

【讨论】:

【参考方案2】:

我知道这个帖子很久以前了。我用当前版本的 Python3 和 Gtk3 尝试了你的代码,但不起作用。它仅适用于新行。现有行不会跳到下一个单元格。如果我添加“return True”,那么每个单元格都可以使用现有的单元格进行 Tab,但不会更新。

【讨论】:

嗨!太伤心了...该代码目前非常陈旧且未维护,并且基于python 2。也许有人在库级别解决了这个问题。您是否尝试删除超时添加或增加它?如果您解决了问题,请告诉我! 增量超时不起作用。并且删除超时根本没有标签

以上是关于Python PyGOobject treeview:使用 Tab 键在单元格之间移动后确认编辑的主要内容,如果未能解决你的问题,请参考以下文章

TreeView而不是WebView?

Treeview 丢失焦点后依然高亮 SelectedNode

WPF C# TreeView 获取所选项目的文本

C#如何实现树型菜单

带有 ExtendedSelection 的 Qml TreeView 中的 selectedRows() 落后了一步

当所有子项都折叠或隐藏时,如何在分层数据模板中隐藏扩展器?