2013-04-08 63 views
1

拷贝Pasteable文字我遇到了这个颇为意外的问题。我有一个gtk.TreeView和一个单独的文本列,由gtk.CellRendererText渲染。我想要的是,用户可以使用鼠标标记显示的文本并按下ctrl + c将其放入剪贴板。 (我指的是每个浏览器和文本编辑器中都有的基本功能)。但是,gtk不会让我这样做。我有一个简单的例子,在这里,非打标/非高亮文本:在PyGTK中的TreeView控件

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() 

我当然可以使细胞可编辑,因为编辑模式提供的功能。但是这远非优雅,因为它是某种弹出式的,打破了线条包裹,并且编辑了文本。我需要的是一个单元格,它不是可选择的,可编辑的或任何其他的,但有文本,可以复制。

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

回答

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() 
+0

基本上,您的解决方案是使单元格可编辑,但不提供回调以阻止保存更改。 – Flimm 2013-04-17 14:27:40

+0

你是正确的,但@Pappenheimer只想让他的单元格可编辑,复制和粘贴。如果你想在一些单元格中保存更改,请更新你的列表。 – MyMy 2013-04-17 15:17:36

+1

它仍然不理想,因为用户可以看似改变单元格的内容,只有在失去焦点时才会改变它们。 – Flimm 2013-04-17 15:26:12

0

我在代码中做了一些修改。试图回答@Flimm的问题。我hpe帮助你@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() 
+1

我意识到您可以添加回调编辑列表存储以使更改永久。我不是这个意思。我的意思是,如果可以选择文本,但输入“a”,“b”或任何随机字母,并且*这些字母甚至暂时不会出现,那将会很好。 – Flimm 2013-04-18 08:52:52