在pygtk'中复制可粘贴文本;s TreeView
我遇到了这个意想不到的问题。我有一个带有单个文本列的gtk.TreeView,它由gtk.cellRenderText呈现。我想要的是,用户可以使用鼠标标记显示的文本,并通过按ctrl+c将其放入剪贴板。(我指的是每个webbrowser和texteditor中最基本的功能)。然而,gtk不让我这么做。我这里有一个简单的例子,不可标记/不可高亮显示的文本:在pygtk'中复制可粘贴文本;s TreeView,gtk,pygtk,gtktreeview,Gtk,Pygtk,Gtktreeview,我遇到了这个意想不到的问题。我有一个带有单个文本列的gtk.TreeView,它由gtk.cellRenderText呈现。我想要的是,用户可以使用鼠标标记显示的文本,并通过按ctrl+c将其放入剪贴板。(我指的是每个webbrowser和texteditor中最基本的功能)。然而,gtk不让我这么做。我这里有一个简单的例子,不可标记/不可高亮显示的文本: import gtk class TreeViewExample(gtk.TreeView): def __init__(sel
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()
我当然可以使单元格可编辑,因为可编辑模式提供了该功能。但这远远不够优雅,因为这是一种弹出窗口,它会打断换行符并编辑文本。我需要的是一个单元格,它不是可选择的,可编辑的或任何东西,但有文本,可以复制
有人有解决办法吗?谢谢 我对代码做了一些更改。 试试下面的代码,这个例子效果很好,我相信这就是你问题的答案。 希望这有助于你在未来的知识和编码
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()
我对代码做了一些修改。 试试下面的代码,这个例子效果很好,我相信这就是你问题的答案。 希望这有助于你在未来的知识和编码
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()
我对代码做了一些修改。尝试回答@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()
我对代码做了一些修改。尝试回答@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()
基本上,您的解决方案是使单元格可编辑,但不提供阻止保存更改的回调。您在这方面是正确的,但@Pappenheimer只希望使其单元格可编辑、复制和可复制。如果你想保存某些单元格中的更改,请更新你的列表。这仍然不理想,因为用户似乎可以更改单元格的内容,但一旦失去焦点,更改就会恢复。在我看来,这对用户来说是透明的。构建在listore中的TreeView上的数据,如果不更改模型中的数据,TreeView将无法显示所需的数据,因为在成为listore的模型列表中不存在数据。基本上,您的解决方案是使单元格可编辑,但不提供回调来停止保存更改。您在这方面是正确的,但是@Pappenheimer只想让他的单元格可以编辑、复制和复制。如果你想保存某些单元格中的更改,请更新你的列表。这仍然不理想,因为用户似乎可以更改单元格的内容,但一旦失去焦点,更改就会恢复。在我看来,这对用户来说是透明的。构建在listore中的TreeView上的数据,如果不更改模型中的数据,TreeView将无法显示所需的数据,因为在成为listore的模型列表中不存在。我意识到,您可以添加回调来编辑列表存储,使更改永久化。我不是这个意思。我的意思是,如果可以选择文本,但键入“a”、“b”或任何随机字母,这些字母甚至不会临时出现,那就好了。我意识到,您可以添加回调来编辑列表存储,以使更改永久化。我不是这个意思。我的意思是,如果可以选择文本,但键入“a”、“b”或任何随机字母,这些字母甚至不会临时出现,那就好了。