【问题标题】:Python tkinter treeview get / return iid of selected itemPython tkinter treeview 获取/返回所选项目的 iid
【发布时间】:2017-09-26 04:46:51
【问题描述】:

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

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()

单击树视图中的项目时,错误是:

TypeError: identify() missing 1 required positional argument: 'y'

针对@TessellatingHeckler 的评论,根据链接对代码进行的编辑不会产生错误,但仍不会打印出iid

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

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

【问题讨论】:

  • 那么到底发生了什么?你有错误吗?什么都没有打印?打印错了?
  • 标题应该总结问题
  • @TessellatingHeckler 我已经编辑了我的帖子以反映您的评论
  • 另一种解决方案是iid=tree.focus()

标签: python tkinter treeview


【解决方案1】:

根据docsx, y坐标是

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

所以这里有一个小解决方法,可以解决一些调试打印的问题(注意&lt;&lt;TreeviewSelect&gt;&gt; 事件坐标!):

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()

输出:

【讨论】:

  • 非常感谢!你已经提供了这两个功能,所以我可以选择......太棒了
  • @new_to_coding,这并不完全正确,因为用户可以通过导航键选择项目,因此 mouse_click 事件仅用于比较目的。无论如何,如果选择事件是由导航键(或除鼠标之外的任何东西)触发的,则此代码也将失败,但如果您问我,我会保留此选项(还有更多要编码的东西)!所以我的回答要点 - 你不能只依赖坐标,但如果你真的在选择事件下需要它们 - 我展示了一种解决方法!
  • 任何想法我可以如何使用 > 获取选择的父文本我可以作为一个单独的问题提交,如果你愿意,可以在此处链接
  • @new_to_coding,这是你提出的一个非常广泛的问题,因为你没有提到想要的行为。那里最简单的选项(如果用户当时只能选择一项selectmode='browse')将是tree_click_event 下的单行print(self.tree.item(self.tree.selection()[0])['text'])
  • @new_to_coding,我也认为this 对你也有用。 Focus 返回当前焦点项目(如果selecmode != 'browse',则最后选择)
猜你喜欢
  • 2017-09-25
  • 2017-08-20
  • 2017-09-26
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2011-07-10
  • 2016-11-20
相关资源
最近更新 更多