代码之家  ›  专栏  ›  技术社区  ›  Chmod

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

  •  1
  • Chmod  · 技术社区  · 7 年前

    我正在尝试绑定这个函数self。将TextToClipboard(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()
    

    然而,我无法将其绑定到TreeView对象上;当我运行代码时,我得到:

    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'
    

    如果我尝试打印出树类型,我会发现它不是TreeView对象。有没有关于如何获取TreeView对象的想法,这样我就可以知道选择了哪个项目?

    谢谢 -FF公司

    2 回复  |  直到 7 年前
        1
  •  1
  •   Chmod    7 年前

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

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

    输出: 0

        2
  •  1
  •   sciroccorics    7 年前

    当您使用 bind ,回调函数必须具有 event 作为第一个参数,自定义参数应该放在后面。但由于回调不需要事件参数,因此可以使用lambda对其进行屏蔽。所以您必须同时更改绑定和 def 您的回拨电话:

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

    应该解决问题