Python tkinter treeview获取/返回所选项目的iid

rag*_*ner 1 python treeview tkinter

iid它的目的是当用户单击某个项目并将其打印出来时获取树视图项目的 ,但由于某种原因identify()没有收到 event.y 变量,也许?

import tkinter as tk
from tkinter import ttk

class App:
    def __init__(self):
        self.root = tk.Tk()
        self.tree = ttk.Treeview()
        self.tree.pack(side="top", fill="both")
        self.tree.bind("<<TreeviewSelect>>", self.tree_click_event)

        for i in range(10):
            self.tree.insert("", "end", text="Item %s" % i)

        self.root.mainloop()

    def tree_click_event(self, event):
        iid = self.tree.identify(event.x,event.y)
        print (iid)

if __name__ == "__main__":
    app = App()
Run Code Online (Sandbox Code Playgroud)

单击树视图中的项目后,错误为:

TypeError: identify() missing 1 required positional argument: 'y'
Run Code Online (Sandbox Code Playgroud)

为了响应 @TessellationHeckler 的评论,基于链接对代码进行的编辑不会产生错误,但仍然不会打印出iid

def tree_click_event(self, event):
    item = self.tree.identify('item', event.x,event.y)
    print (item)
Run Code Online (Sandbox Code Playgroud)

感谢您接受@CommonSense的答案,总结看来我需要使用 self.tree.bind('<1>', self.tree_click_event) 而不是 treeviewselect 来解决这个特定问题,但感谢您提供第二种方法事情也是如此

Com*_*nse 5

根据文档 x, y坐标是

对于 KeyPress、KeyRelease、ButtonPress、ButtonRelease、Motion、Enter、Leave、Expose、Configure、Gravity 和 Reparent 事件有效。

因此,这里有一些调试打印问题的解决方法<<TreeviewSelect>>(注意事件坐标!):

try:
    import tkinter as tk
    import tkinter.ttk as ttk
except ImportError:
    import Tkinter as tk
    import ttk


class App:
    def __init__(self):
        self.root = tk.Tk()
        self.tree = ttk.Treeview()
        self.tree.pack(side="top", fill="both")
        self.tree.bind('<<TreeviewSelect>>', self.tree_click_event)
        self.tree.bind('<1>', self.on_click)
        for i in range(10):
            self.tree.insert("", "end", text="Item %s" % i)

        self.root.mainloop()


    def tree_click_event(self, event):
        real_coords = (self.tree.winfo_pointerx() - self.tree.winfo_rootx(),
                       self.tree.winfo_pointery() - self.tree.winfo_rooty())
        item = self.tree.identify('item', *real_coords)
        print('********** tree selection event **********')
        print('looks like this virtual event doesnt support event coordinates')
        print('event.x: %d, event.y: %d' % (event.x, event.y))
        print('real.x: %d, real.y: %d' % real_coords)
        print('clicked on', self.tree.item(item)['text'])
        print('******************************************\n')


    def on_click(self, event):
        item = self.tree.identify('item', event.x, event.y)
        print('********** tree mouse click event **********')
        print('clicked on', self.tree.item(item)['text'])
        print('event.x: %d, event.y: %d' % (event.x, event.y))
        print('******************************************\n')



if __name__ == "__main__":
    app = App()
Run Code Online (Sandbox Code Playgroud)

输出: 输出

  • @new_to_coding,这并不完全正确,因为用户可以通过导航键选择项目,因此 mouse_click 事件仅用于比较目的。无论如何,如果选择事件是由导航键(或除鼠标之外的任何东西)触发的,则此代码也会失败,但如果您问我,我会保留此选项(还有更多需要编码的东西)!所以我的回答是 - 你不能只依赖坐标,但如果你真的在选择事件下需要它们 - 有一个解决方法,我展示了! (2认同)