Python Tkinter TreeView绑定左键单击当前树和选定项

Python Tkinter TreeView绑定左键单击当前树和选定项,python,tkinter,treeview,Python,Tkinter,Treeview,我正在尝试将这个函数self.copyTextToClipboard(self,t)绑定到多个不同的树,以使其更灵活(请参见下面的绑定)。 从tkinter.ttk导入树视图 从tkinter进口* class App: def __init__(self, master): self.master = master frame = Frame(master) master.geometry("{}x{}".format(master.w

我正在尝试将这个函数self.copyTextToClipboard(self,t)绑定到多个不同的树,以使其更灵活(请参见下面的绑定)。 从tkinter.ttk导入树视图 从tkinter进口*

class App:
    def __init__(self, master):
        self.master = master
        frame = Frame(master)

        master.geometry("{}x{}".format(master.winfo_screenwidth() - 100, master.winfo_screenheight() - 100))
        master.resizable(False, False)

        self.leftFrame = Frame(master, bg="#DADADA", width=375, relief=SUNKEN)
        self.leftFrame.pack_propagate(0)
        self.leftFrame.pack(side=LEFT, fill=Y, padx=1)

        # This table (TreeView) will display the partitions in the tab
        self.partitionsOpenDiskTree = Treeview(self.leftFrame, columns=("#"), show="headings", selectmode="browse", height=23)

        yscrollB = Scrollbar(self.leftFrame)
        yscrollB.pack(side=RIGHT, fill=Y)

        self.partitionsOpenDiskTree.column("#", width=50)
        self.partitionsOpenDiskTree.heading("#", text="#")
        self.partitionsOpenDiskTree.configure(yscrollcommand=yscrollB.set)

        # Bind left click on text widget to copy_text_to_clipboard() function
        self.partitionsOpenDiskTree.bind("<ButtonRelease-1>", lambda t=self.partitionsOpenDiskTree: self.copyTextToClipboard(self,t))

        # Adding the entries to the TreeView
        for i in range(3):
            self.partitionsOpenDiskTree.insert("", "end", i, values=(i), tags=str(i))

        self.partitionsOpenDiskTree.pack(anchor=NW, fill=Y)

    #todo: figure out where this is getting called and put in tree
    def copyTextToClipboard(self, tree, event=None):
        print(type(tree))
        # triggered off left button click on text_field
        root.clipboard_clear()  # clear clipboard contents
        textList = tree.item(tree.focus())["values"]
        line = ""
        for text in textList:
            if line != "":
                line += ", " + str(text)
            else:
                line += str(text)

        root.clipboard_append(line)  # append new value to clipbaord

root = Tk()
app = App(root)
root.mainloop()
class应用程序:
定义初始(自我,主):
self.master=master
帧=帧(主帧)
master.geometry(“{}x{}”.format(master.winfo_screenwidth()-100,master.winfo_screenheight()-100))
master.可调整大小(False,False)
self.leftFrame=Frame(master,bg=“#DADADA”,宽度=375,浮雕=凹陷)
self.leftFrame.pack_传播(0)
self.leftFrame.pack(side=LEFT,fill=Y,padx=1)
#此表(TreeView)将在选项卡中显示分区
self.partitionsOpenDiskTree=Treeview(self.leftFrame,columns=(“#”)show=“headers”,selectmode=“browse”,height=23)
yscrollB=滚动条(self.leftFrame)
yscrollB.pack(侧面=右侧,填充=Y)
self.partitionsOpenDiskTree.column(“#”,宽度=50)
self.partitionsOpenDiskTree.heading(“#”),text=“#”)
self.partitionsOpenDiskTree.configure(yscrollcommand=yscrollB.set)
#绑定左键单击文本小部件以将\u text\u复制到\u剪贴板()函数
self.partitionsOpenDiskTree.bind(“,lambda t=self.partitionsOpenDiskTree:self.copyTextToClipboard(self,t))
#将条目添加到树视图
对于范围(3)中的i:
self.partitionsOpenDiskTree.insert(“,“end”,i,value=(i),tags=str(i))
self.partitionsOpenDiskTree.pack(锚定=NW,填充=Y)
#todo:找出呼叫的位置并将其放入树中
def copyTextToClipboard(自身、树、事件=无):
打印(类型(树))
#触发左键单击文本字段
root.clipboard_clear()#清除剪贴板内容
textList=tree.item(tree.focus())[“values”]
line=“”
对于文本列表中的文本:
如果行!="":
行+=”,“+str(文本)
其他:
行+=str(文本)
root.clipboard_append(line)#将新值追加到clipboard
root=Tk()
app=app(根目录)
root.mainloop()
然而,我无法将它绑定到一个看起来像树视图的对象上;当我运行代码时,我得到:

Exception in Tkinter callback
<class '__main__.App'>
Traceback (most recent call last):
  File "C:\Users\user1\Anaconda3\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:/Users/user1/main_merged.py", line 56, in <lambda>
    lambda t=self.partitionsOpenDiskTree: self.copyTextToClipboard(self,t))
  File "C:/Users/user1/main_merged.py", line 70, in copyTextToClipboard
    textList = tree.item(tree.focus())["values"]
AttributeError: 'App' object has no attribute 'item'
Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“C:\Users\user1\Anaconda3\lib\tkinter\\uuuuu init\uuuuu.py”,第1699行,在调用中__ 返回self.func(*args) 文件“C:/Users/user1/main_merged.py”,第56行,在 lambda t=self.partitionsOpenDiskTree:self.copyTextToClipboard(self,t)) copyTextToClipboard中的文件“C:/Users/user1/main_merged.py”,第70行 textList=tree.item(tree.focus())[“values”] AttributeError:“应用程序”对象没有属性“项” 如果我试图打印出树类型,我会发现它不是TreeView对象。关于如何获取TreeView对象,以便确定选择了哪个项目,有什么想法吗

谢谢!
-FF

使用
bind
时,回调函数的第一个参数必须是
事件
,自定义参数应放在后面。但是,由于回调不需要事件参数,因此可以使用lambda将其屏蔽。因此,您必须同时更改回调的绑定和
def

self.partitionsOpenDiskTree.bind("<ButtonRelease-1>", lambda event, t=self.partitionsOpenDiskTree: self.copyTextToClipboard(t))

...

def copyTextToClipboard(self, tree):
self.partitionsOpenDiskTree.bind(“,lambda事件,t=self.partitionsOpenDiskTree:self.copyTextToClipboard(t))
...
def copyTextToClipboard(自身,树):

应该可以解决这个问题

因此,显然,取消自我呼叫似乎是可行的:

from tkinter.ttk import Treeview
from tkinter import *

class App:
    def __init__(self, master):
        self.master = master
        frame = Frame(master)

        master.geometry("{}x{}".format(master.winfo_screenwidth() - 100, master.winfo_screenheight() - 100))
        master.resizable(False, False)

        self.leftFrame = Frame(master, bg="#DADADA", width=375, relief=SUNKEN)
        self.leftFrame.pack_propagate(0)
        self.leftFrame.pack(side=LEFT, fill=Y, padx=1)

        # This table (TreeView) will display the partitions in the tab
        self.partitionsOpenDiskTree = Treeview(self.leftFrame, columns=("#"), show="headings", selectmode="browse", height=23)

        yscrollB = Scrollbar(self.leftFrame)
        yscrollB.pack(side=RIGHT, fill=Y)

        self.partitionsOpenDiskTree.column("#", width=50)
        self.partitionsOpenDiskTree.heading("#", text="#")
        self.partitionsOpenDiskTree.configure(yscrollcommand=yscrollB.set)

        # Bind left click on text widget to copy_text_to_clipboard() function
        self.partitionsOpenDiskTree.bind("<ButtonRelease-1>", lambda event, t=self.partitionsOpenDiskTree: self.copyTextToClipboard(t))

        # Adding the entries to the TreeView
        for i in range(3):
            self.partitionsOpenDiskTree.insert("", "end", i, values=(i), tags=str(i))

        self.partitionsOpenDiskTree.pack(anchor=NW, fill=Y)

    #todo: figure out where this is getting called and put in tree
    def copyTextToClipboard(self, tree, event=None):
        print(type(tree))
        # print(type(tree.partitionsOpenDiskTree))
        # triggered off left button click on text_field
        root.clipboard_clear()  # clear clipboard contents
        textList = tree.item(tree.focus())["values"]
        line = ""
        for text in textList:
            if line != "":
                line += ", " + str(text)
            else:
                line += str(text)

        root.clipboard_append(line)  # append new value to clipbaord
        print(line)

root = Tk()
app = App(root)
root.mainloop()
来自tkinter.ttk导入树视图
从tkinter进口*
类应用程序:
定义初始(自我,主):
self.master=master
帧=帧(主帧)
master.geometry(“{}x{}”.format(master.winfo_screenwidth()-100,master.winfo_screenheight()-100))
master.可调整大小(False,False)
self.leftFrame=Frame(master,bg=“#DADADA”,宽度=375,浮雕=凹陷)
self.leftFrame.pack_传播(0)
self.leftFrame.pack(side=LEFT,fill=Y,padx=1)
#此表(TreeView)将在选项卡中显示分区
self.partitionsOpenDiskTree=Treeview(self.leftFrame,columns=(“#”)show=“headers”,selectmode=“browse”,height=23)
yscrollB=滚动条(self.leftFrame)
yscrollB.pack(侧面=右侧,填充=Y)
self.partitionsOpenDiskTree.column(“#”,宽度=50)
self.partitionsOpenDiskTree.heading(“#”),text=“#”)
self.partitionsOpenDiskTree.configure(yscrollcommand=yscrollB.set)
#绑定左键单击文本小部件以将\u text\u复制到\u剪贴板()函数
self.partitionsOpenDiskTree.bind(“,lambda事件,t=self.partitionsOpenDiskTree:self.copyTextToClipboard(t))
#将条目添加到树视图
对于范围(3)中的i:
self.partitionsOpenDiskTree.insert(“,“end”,i,value=(i),tags=str(i))
self.partitionsOpenDiskTree.pack(锚定=NW,填充=Y)
#todo:找出呼叫的位置并将其放入树中
def copyTextToClipboard(自身、树、事件=无):
打印(类型(树))
#打印(类型(tree.partitionsOpenDiskTree))
#触发左键单击文本字段
root.clipboard_clear()#清除剪贴板内容
textList=tree.item(tree.focus())[“values”]
line=“”
对于文本列表中的文本:
如果行!="":
行+=”,“+str(文本)
其他:
行+=str(文本)
root.clipboard_append(line)#将新值追加到clipboard
打印(行)
root=Tk()
app=app(根目录)
root.mainloop()
输出:
0

请修复缩进,以便我们检查“您的”代码。似乎有很多额外的代码。请尽量减少到最低限度。如果您的问题在于
Treeview
绑定,那么您只需要几个小部件、bind语句和绑定函数no。我更新了代码以反映上述注释。看起来
tr