tkinter 树视图 - 拖放?

问题描述 投票:0回答:4

我可以了解如何在树中剪切和粘贴节点,或者使用按钮或键绑定上下移动它们。 有没有办法实现在树视图周围拖放节点?

python tkinter
4个回答
11
投票

这里有一些处理左键单击和 Shift-左键单击的工作示例代码:

import Tkinter as tk
import ttk

def bDown_Shift(event):
    tv = event.widget
    select = [tv.index(s) for s in tv.selection()]
    select.append(tv.index(tv.identify_row(event.y)))
    select.sort()
    for i in range(select[0],select[-1]+1,1):
        tv.selection_add(tv.get_children()[i])

def bDown(event):
    tv = event.widget
    if tv.identify_row(event.y) not in tv.selection():
        tv.selection_set(tv.identify_row(event.y))    

def bUp(event):
    tv = event.widget
    if tv.identify_row(event.y) in tv.selection():
        tv.selection_set(tv.identify_row(event.y))    

def bUp_Shift(event):
    pass

def bMove(event):
    tv = event.widget
    moveto = tv.index(tv.identify_row(event.y))    
    for s in tv.selection():
        tv.move(s, '', moveto)

root = tk.Tk()

tree = ttk.Treeview(columns=("col1","col2"), 
                    displaycolumns="col2", 
                    selectmode='none')

# insert some items into the tree
for i in range(10):
    tree.insert('', 'end',iid='line%i' % i, text='line:%s' % i, values=('', i))

tree.grid()
tree.bind("<ButtonPress-1>",bDown)
tree.bind("<ButtonRelease-1>",bUp, add='+')
tree.bind("<B1-Motion>",bMove, add='+')
tree.bind("<Shift-ButtonPress-1>",bDown_Shift, add='+')
tree.bind("<Shift-ButtonRelease-1>",bUp_Shift, add='+')

root.mainloop()

6
投票

您必须自己进行设置,但这绝对是可能的。您只需要为

<ButtonPress-1>
(标识要拖动的项目)、
<ButtonRelease-1>
(实现放置)和
<B1-Motion>
(在拖动过程中提供反馈)

进行适当的绑定即可

4
投票

无法对解决方案发表评论,因此在此处添加了我的 50c: 要解决通过多级树上下拖动的问题,您需要在移动时指定父 ID,如下所示:

tv.move(s, tv.identify_row(event.y), moveto)

这可能对某人有用......


0
投票

由于我无法评论这篇旧帖子,所以我也留下了另一个答案。

在 Treeview 中,为了使用 Ctrl + 单击和 Shift + 单击,可以使用 tree.configure(selectmode="extended") 代替。它更简单并且效果更好。

虽然拖动选择不适用于此方法,所以您必须单独添加它。

© www.soinside.com 2019 - 2024. All rights reserved.