gtk TreeView中的复制可存档文本

时间:2013-04-08 12:27:51

标签: gtk pygtk gtktreeview

我遇到了这个意想不到的问题。我有一个带有单个文本列的gtk.TreeView,它由gtk.CellRendererText呈现。我想要的是用户可以使用鼠标标记显示的文本,并按ctrl + c将其放入剪贴板。 (我指的是每个webbrowser和texteditor中的基本功能)。但是,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()

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

有没有人有解决方案?谢谢!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

我在代码中做了一些更改。试着回答 @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()