问题描述
有没有办法将 ttk Treeview 与可编辑的行一起使用?
我的意思是它应该更像一张桌子.例如,双击该项目使 #0 列可编辑".
I mean it should work more like a table. For example on double click on the item make the #0 column 'editable'.
如果这是不可能的,任何允许鼠标选择项目的方法都可以.我在 tkdocs 或其他文档中没有发现任何提及.
If this isn't possible, any way to allow mouse selecting on the item would be just fine. I haven't found any mention of this in tkdocs or other documents.
推荐答案
经过长时间的研究,我还没有找到这样的功能,所以我想应该有.Tk 是非常简单的界面,它允许程序员从基础构建高级"功能.所以我想要这样的行为.
After long research I haven't found such feature so I guess there's any. Tk is very simple interface, which allows programmer to build 'high-level' features from the basics. So my desired behaviour this way.
def onDoubleClick(self, event):
''' Executed, when a row is double-clicked. Opens
read-only EntryPopup above the item's column, so it is possible
to select text '''
# close previous popups
# self.destroyPopups()
# what row and column was clicked on
rowid = self._tree.identify_row(event.y)
column = self._tree.identify_column(event.x)
# get column position info
x,y,width,height = self._tree.bbox(rowid, column)
# y-axis offset
# pady = height // 2
pady = 0
# place Entry popup properly
text = self._tree.item(rowid, 'text')
self.entryPopup = EntryPopup(self._tree, rowid, text)
self.entryPopup.place( x=0, y=y+pady, anchor=W, relwidth=1)
这是将 ttk.Treeview 组成为 self._tree 的类中的方法
This is method within a class which composes ttk.Treeview as self._tree
然后 EntryPopup 是 Entry 的非常简单的子类:
And EntryPopup is then very simple sub-class of Entry:
class EntryPopup(Entry):
def __init__(self, parent, iid, text, **kw):
''' If relwidth is set, then width is ignored '''
super().__init__(parent, **kw)
self.tv = parent
self.iid = iid
self.insert(0, text)
# self['state'] = 'readonly'
# self['readonlybackground'] = 'white'
# self['selectbackground'] = '#1BA1E2'
self['exportselection'] = False
self.focus_force()
self.bind("<Return>", self.on_return)
self.bind("<Control-a>", self.select_all)
self.bind("<Escape>", lambda *ignore: self.destroy())
def on_return(self, event):
self.tv.item(self.iid, text=self.get())
self.destroy()
def select_all(self, *ignore):
''' Set selection on the whole text '''
self.selection_range(0, 'end')
# returns 'break' to interrupt default key-bindings
return 'break'
这篇关于如何使 ttk.Treeview 的行可编辑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!