是否有一种在Gtk TreeView中粘贴项目之后或之下的项目的好方法。用一个功能甚至可以做到这一点吗?我做了这个自包含的例子,但我不确定这种行为的最佳实践应该是什么。有没有办法取消选择TreeView,然后如果没有选择任何内容则粘贴到最后?
from gi.repository import Gtk, Gdk
import json
class MainWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="TreeView Drag and Drop")
self.connect("delete-event", Gtk.main_quit)
self.set_border_width(10)
self.set_default_size(400, 300)
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(vbox)
self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
button = Gtk.Button("Cut")
button.connect("clicked", self.on_cut_clicked)
hbox.pack_start(button, True, True, 0)
button = Gtk.Button(stock=Gtk.STOCK_COPY)
button.connect("clicked", self.on_copy_clicked)
hbox.pack_start(button, True, True, 0)
button = Gtk.Button(stock=Gtk.STOCK_PASTE)
button.connect("clicked", self.on_paste_clicked)
hbox.pack_start(button, True, True, 0)
vbox.add(hbox)
self.store = Gtk.TreeStore(bool, str)
self.view = Gtk.TreeView(model=self.store)
vbox.add(self.view)
renderer_toggle = Gtk.CellRendererToggle()
column_toggle = Gtk.TreeViewColumn("", renderer_toggle, active=0)
renderer_toggle.connect("toggled", self.on_toggled)
self.view.append_column(column_toggle)
renderer_name = Gtk.CellRendererText()
column_name = Gtk.TreeViewColumn("Name", renderer_name, text=1)
self.view.append_column(column_name)
self.add_test_data()
def add_test_data(self):
parent = self.store.append(None, [True, "Item 1"])
self.store.append(parent, [True, "Item 2"])
self.store.append(None, [True, "Item 3"])
self.store.append(None, [True, "Item 4"])
def on_toggled(self, cellrenderer, path):
self.store[path][0] = not self.store[path][0]
def on_cut_clicked(self, button):
"""Ignores children of selection"""
self.on_copy_clicked(None)
selection = self.view.get_selection()
model, row_list = selection.get_selected_rows()
itr = model.get_iter(row_list[0])
model.remove(itr)
def on_copy_clicked(self, button):
"""Ignores children of selection"""
selection = self.view.get_selection()
model, row_list = selection.get_selected_rows()
if len(row_list) == 0:
return
liste = []
liste.append("TreeViewRow")
for row in row_list:
path = model[row]
liste.append([path[0], path[1]])
data = json.dumps(liste)
self.clipboard.set_text(data, -1)
def on_paste_clicked(self, button):
"""Ignores children of selection"""
text = self.clipboard.wait_for_text()
try:
parse = json.loads(text)
json_str = True
except:
print("Not JSON")
json_str = False
if text != None and json_str == True:
if parse[0] == "TreeViewRow":
selection = self.view.get_selection()
model, row_list = selection.get_selected_rows()
itr = model.get_iter(row_list[0])
self.store.append(itr, parse[1])
else:
print("Could not paste.")
win = MainWindow()
win.show_all()
Gtk.main()
答案 0 :(得分:1)
是否有一种很好的方法可以在Gtk中的项目之后或之下粘贴项目 树视图。用一个函数甚至可以做到这一点吗?
不是单一功能。此外,如果您启用了多个选择,它也无法正常工作,因为您通常不希望在多个选定行的第一个之后插入。
是否有办法取消选择TreeView然后粘贴到 如果没有选择任何结束?
'行为'一个程序并不是最佳实践的问题,而是你希望程序如何表现的问题。为了接受几种不同的风格,这些功能分为几个步骤。 我认为直观的步骤是:
self.view.get_selection()
selection.get_selected()
insert_after
如果get_selected
返回itr == None
,那么您可以使用append(None...)
,因此新行将附加在最后。