2013-04-08 60 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