【问题标题】:Copy-Pasteable Text in pygtk's TreeViewpygtk 的 TreeView 中的可复制粘贴文本
【发布时间】:2013-04-18 00:49:46
【问题描述】:

我遇到了这个相当出乎意料的问题。我有一个带有单个文本列的 gtk.TreeView,由 gtk.CellRendererText 呈现。我想要的是用户可以使用鼠标标记显示的文本并通过按 ctrl+c 将其放入剪贴板。 (我指的是每个网络浏览器和文本编辑器中存在的非常基本的功能)。但是,gtk 不会让我这样做。我在这里有一个简单的例子,带有不可标记/不可高亮的文本:

import gtk

class TreeViewExample(gtk.TreeView):

    def __init__(self):
        gtk.TreeView.__init__(self)
        self.get_selection().set_mode(gtk.SELECTION_NONE)
        self.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_HORIZONTAL)

        # create  model
        self.list_store = gtk.ListStore(str)
        self.list_store.append(['Hello, this is some \n multiline text.'])
        self.list_store.append(['Another text.'])
        self.set_model(self.list_store)

        # create text column
        col = gtk.TreeViewColumn('Text Column')
        self.append_column(col)
        cell = gtk.CellRendererText()
        col.pack_start(cell, True)
        col.add_attribute(cell, 'text', 0)



class MasterWindow(object):

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_size_request(500,500)
        self.window.connect("destroy", self.destroy)       
        self.window.add(TreeViewExample())
        self.window.show_all()


if __name__ == '__main__':
    mw = MasterWindow()
    gtk.main()

我当然可以使单元格可编辑,因为可编辑模式提供了该功能。但这远非优雅,因为它是某种弹出窗口,它打破了换行并编辑文本。我需要的是一个单元格,它不可选择、不可编辑或其他任何东西,但有可复制的文本。

有人有解决办法吗?谢谢!

【问题讨论】:

    标签: gtk pygtk gtktreeview


    【解决方案1】:

    我对代码进行了一些更改。 试试下面的代码,这个例子效果很好,我相信这就是你问题的答案。 希望这对您未来的知识和编码有所帮助。

    import gtk
    
    class TreeViewExample():
        def __init__(self):        
            self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.window.set_size_request(500,500)       
    
            model = gtk.ListStore(str)
            model.append(['a'])
            model.append(['b'])
            model.append(['c'])
    
            treeview = gtk.TreeView(model)
    
            self.renderer = gtk.CellRendererText()
            self.renderer.set_property('editable', True)
            treeview.insert_column_with_attributes(-1, 'Copy-Pastable-Editable String', self.renderer, text=0)
    
            self.window.add(treeview)
            self.window.show_all()
    if __name__ == '__main__':
        TreeViewExample()
        gtk.main()
    

    【讨论】:

    • 基本上,您的解决方案是使单元格可编辑,但不提供回调以阻止保存更改。
    • 你在这条评论中是对的,但@Pappenheimer 只想让他的单元格可编辑、复制和粘贴。如果您想在某些单元格中保存更改,请更新您的列表。
    • 这仍然不理想,因为用户似乎可以更改单元格的内容,只是在失去焦点时才恢复更改。
    • 在我看来它对用户是透明的。 TreeView 上的数据内置在 listore 中,如果不更改模型中的数据,treeview 将无法显示您想要的数据,因为在成为 listore 的模型列表中不存在
    【解决方案2】:

    我对代码进行了一些更改。尝试回答 @Flimm 的问题。希望能帮助您 @Flimm

    import gtk
    
    class TreeViewExample():
        def __init__(self):        
            self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.window.set_size_request(500,500)       
    
            self.model = gtk.ListStore(str,str)
            self.model.append(['a','b'])
            self.model.append(['c','a'])
            self.model.append(['d','a'])
            self.model.append(['e','a'])            
            self.treeview = gtk.TreeView(self.model)
    
            self.renderer = gtk.CellRendererText()
            self.renderer.set_property('editable', True)
            self.renderer.connect('edited', self._text_changed, 0)
            self.treeview.insert_column_with_attributes(-1, 'Copy-Pastable-Editable String', self.renderer, text=0)
            self.treeview.insert_column_with_attributes(-1, 'Copy-Pastable-Editable String', self.renderer, text=1)            
    
            self.window.add(self.treeview)
            self.window.show_all()
    
        def _text_changed( self, w, row, new_value, column):
            self.model[row][column] = new_value
    if __name__ == '__main__':
        TreeViewExample()
        gtk.main()
    

    【讨论】:

    • 我意识到您可以添加回调来编辑列表存储以使更改永久化。那并非我的本意。我的意思是,如果可以选择文本,但输入“a”、“b”或任何随机字母,并且这些字母甚至暂时不会出现,那将是一件好事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多