首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >treeview identify_element()方法返回“填充”

treeview identify_element()方法返回“填充”
EN

Stack Overflow用户
提问于 2019-09-28 22:32:23
回答 1查看 1K关注 0票数 1

我正在尝试使用identify_element()方法实现treeview中的拖放,以指示我需要在哪里插入项。

当触发<ButtonRelease-1>事件时,我调用identify_element(),它返回单词“填充”,而不是treeview项。我知道它为什么不像它应该做的那样在x/y弦处返回项。

代码语言:javascript
复制
import os
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import messagebox


class App(tk.Tk):
    def __init__(self, path):
        super().__init__()
        self.title("Ttk Treeview")

        abspath = os.path.abspath(path)
        self.nodes = {}
        self.tree = ttk.Treeview(self)
        self.tree.heading("#0", text=abspath, anchor=tk.W)
        ysb = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.tree.yview)
        xsb = ttk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.tree.xview)
        self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)

        self.tree.grid(row=0, column=0, sticky=tk.N + tk.S + tk.E + tk.W)
        ysb.grid(row=0, column=1, sticky=tk.N + tk.S)
        xsb.grid(row=1, column=0, sticky=tk.E + tk.W)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)

        self.tree.bind("<<TreeviewOpen>>", self.open_node)

        def button_release(e):
            print('Results =', self.tree.identify_element(e.x, e.y))

        self.tree.bind("<ButtonRelease-1>", button_release)

        self.populate_node("", abspath)

    def populate_node(self, parent, abspath):
        try:
            for entry in os.listdir(abspath):
                entry_path = os.path.join(abspath, entry)

                node = self.tree.insert(parent, tk.END, text=entry, open=False)
                if os.path.isdir(entry_path):
                    self.nodes[node] = entry_path
                    self.tree.insert(node, tk.END)
        except:
            messagebox.showerror('Access Denied', f'Sorry you do not have access privileges for, {abspath}.')

    def open_node(self, _):
        item = self.tree.focus()
        abspath = self.nodes.pop(item, False)
        if abspath:
            children = self.tree.get_children(item)
            self.tree.delete(children)
            self.populate_node(item, abspath)


if __name__ == "__main__":
    app = App(path="/")
    app.mainloop()

我希望identify_element()的输出应该返回一个treeview项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-28 23:06:25

identify_element被设计成返回单击了小部件的哪个部分(即: treeview布局中定义的元素之一),而不是您单击的项目。

在tcl/tk中,您将使用.tree identify item而不是.tree identify element。奇怪的是,tkinter没有提供类似的identify_item方法。但是,它确实公开了泛型identify方法,该方法可以作为它的第一个参数传递给"item",以标识光标下的树项id。

代码语言:javascript
复制
print('Results =', self.tree.identify("item", e.x, e.y))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58150792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档