Python Tkinter TreeView绑定左键单击当前树和选定项
我正在尝试将这个函数self.copyTextToClipboard(self,t)绑定到多个不同的树,以使其更灵活(请参见下面的绑定)。 从tkinter.ttk导入树视图 从tkinter进口*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
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