2015-10-22 269 views
1

我创建了一个TreeView,但我希望能够在调用特定函数时隐藏某些列。所以这个TreeView最初被创建,但是当我调用一个函数时,可以说除[trackArtist]之外的所有列都是隐藏的。我该怎么做呢?我可以通过在函数中重写部分TreeView(我想要显示的列)来让它工作,但看起来非常多余。在Tkinter中隐藏TreeView列

def some_function(self): 
     self.tree = ttk.Treeview(self.stationBuilderMenuMiddleFrame) 
     ttk.Style().configure("displayField", background="#850664", foreground="#000000", fieldbackground="#FFFFFF") 
     ysb = ttk.Scrollbar(self.stationBuilderMenu, orient=tk.VERTICAL, command=self.tree.yview) 
     xsb = ttk.Scrollbar(self.stationBuilderMenu, orient=tk.HORIZONTAL, command=self.tree.xview) 
     self.tree.configure(yscrollcommand=ysb.set) 
     self.tree.configure(xscrollcommand=xsb.set) 

     self.tree["columns"]=("trackNumber", "trackTitle", "artistCat", "artistDisplay", "trackArtist", "album", 
           "albumLabel", "composer", "year", "trackDuration", "albumAsin", "albumItunes", "ISRC", 
           "filename", "albumCoverName", "notes") 
     self.tree.column("trackNumber", stretch=0, anchor=N) 
     self.tree.column("trackTitle", stretch=0, anchor=N) 
     self.tree.column("artistCat", stretch=0, anchor=N) 
     self.tree.column("artistDisplay", stretch=0, anchor=N) 
     self.tree.column("trackArtist", stretch=0, anchor=N) 
     self.tree.column("album", stretch=0, anchor=N) 
     self.tree.column("albumLabel", stretch=0, anchor=N) 
     self.tree.column("composer", stretch=0, anchor=N) 
     self.tree.column("year", stretch=0, anchor=N) 
     self.tree.column("trackDuration", stretch=0, anchor=N) 
     self.tree.column("albumAsin", stretch=0, anchor=N) 
     self.tree.column("albumItunes", stretch=0, anchor=N) 
     self.tree.column("filename", stretch=0, anchor=N) 
     self.tree.column("albumCoverName", stretch=0, anchor=N) 
     self.tree.column("notes", stretch=0, anchor=N) 
     self.tree.heading("trackNumber", text="Track Number") 
     self.tree.heading("trackTitle", text="Track Title") 
     self.tree.heading("artistCat", text="Artist CAT") 
     self.tree.heading("artistDisplay", text="Artist Display") 
     self.tree.heading("trackArtist", text="Track Artist") 
     self.tree.heading("album", text="Album") 
     self.tree.heading("albumLabel", text="Album Label") 
     self.tree.heading("composer", text="Composer") 
     self.tree.heading("year", text="Year") 
     self.tree.heading("trackDuration", text="Track Duration") 
     self.tree.heading("albumAsin", text="Album ASIN") 
     self.tree.heading("albumItunes", text="Album iTunes") 
     self.tree.heading("ISRC", text="ISRC") 
     self.tree.heading("filename", text="File Name") 
     self.tree.heading("albumCoverName", text="Album Cover Filename") 
     self.tree.heading("notes", text="Notes") 
     self.tree.grid(in_=self.stationBuilderMenuMiddleFrame, row=0, column=0, sticky=tk.NSEW) 
     ysb.grid(in_=self.stationBuilderMenuMiddleFrame, row=0, column=1, sticky=tk.NS) 
     xsb.grid(in_=self.stationBuilderMenuMiddleFrame, row=1, column=0, sticky=tk.EW) 
     self.stationBuilderMenuMiddleFrame.rowconfigure(0, weight=1) 
     self.stationBuilderMenuMiddleFrame.columnconfigure(0, weight=1) 

这是我扔在一起的黑客代码。不能很好地工作。

def some_other_function(self): 
    # things happen 
    # inefficient code below 
    self.tree["columns"]=("artistCat", "artistDisplay") 
    self.tree.column("artistCat", stretch=0, anchor=N) 
    self.tree.column("artistDisplay", stretch=0, anchor=N) 
    self.tree.heading("artistCat", text="Artist CAT") 
    self.tree.heading("artistDisplay", text="Artist Display") 

class StationBuilder(): 
    def __init__(self, master, importTree): 
     self.importTree = importTree 
     self.stationBuilderMenu = master 
     self.stationBuilderMenu = Toplevel(master) 
     self.stationBuilderMenuTopFrame = Frame(self.stationBuilderMenu, bg="#BFC0C2", bd=1, relief=RIDGE) 
     self.stationBuilderMenuMiddleFrame = Frame(self.stationBuilderMenu) 
     self.stationBuilderMenuBottomFrame = Frame(self.stationBuilderMenu, bg="#BFC0C2", bd=1, relief=RIDGE) 
     self.stationBuilderMenuRightFrame = Frame(self.stationBuilderMenu, bg="#BFC0C2", bd=1, relief=RIDGE, width=300) 
     self.stationBuilderMenu.wm_title("AccuAdmin - toStationBuilder") 
     self.stationBuilderMenu.configure(background="#BFC0C2") 
     self.currentTrack = 0 
     self.currentState = 0 
     self.artistObjectId = "" 
     self.albumObjectId = "" 
     self.composerObjectId = "" 
     self.trackObjectId = "" 
     self.treeId = "" 
     self.states = [self.search_artist, self.search_album, self.search_composer, self.search_track] 

     self.match = Button(self.stationBuilderMenuBottomFrame, text="Match", highlightbackground="#BFC0C2", 
          command=self.exists) 
     self.createNewObject = Button(self.stationBuilderMenuBottomFrame, text="", highlightbackground="#BFC0C2", 
             command=self.create_new_object) 
     self.currentObject = Label(self.stationBuilderMenuTopFrame, text="", font=("default", 50), bg="#BFC0C2", 
            fg="#FFFFFF") 
     self.currentlyProcessedTrackHeading = Label(self.stationBuilderMenuRightFrame, text="- Current Track -", 
                bg="#BFC0C2") 
     self.currentlyProcessedTrack = Label(self.stationBuilderMenuRightFrame, text="", bg="#BFC0C2") 

     self.create_potential_match_display() 

     self.stationBuilderMenuBottomFrame.pack(side=BOTTOM, fill=X) 
     self.stationBuilderMenuTopFrame.pack(side=TOP, fill=X) 
     self.stationBuilderMenuRightFrame.pack(side=RIGHT, fill=Y) 
     self.stationBuilderMenuMiddleFrame.pack(side=LEFT, fill=BOTH) 
     self.currentObject.pack(side=LEFT, padx=(25, 0)) 
     self.currentlyProcessedTrackHeading.pack(side=TOP) 
     self.currentlyProcessedTrack.pack(side=TOP) 
     self.match.pack(side=RIGHT, padx=(0, 25)) 
     self.createNewObject.pack(side=LEFT, padx=(25, 0)) 

     self.states[self.currentState](importedTracks[self.currentTrack]) 
     self.tree.bind("<<TreeviewSelect>>", self.find_selection) 
+0

请包括滚动环境,这是可以验证/测试 – R4PH43L

+0

这个开源项目可能会帮助你很多:https://github.com/talcs/tals_python_task_diary – SomethingSomething

回答

4

您应该能够通过使用

self.tree["displaycolumns"]=("artistCat", "artistDisplay")

发现了Documentation这样做。

要显示所有,但一个,你可以在一个建立起来的循环

exclusionlist=[...] 
displaycolumns=[] 
for col in tree["columns"]: 
    if not "%s"%col in exclusionlist: 
     displaycolumns.append(col) 
tree["displaycolumns"]=displaycolumns 

下面找到工作的代码,不会弄乱数据。 仅用tree["displaycolumns"]=[...]



    #!/usr/bin/env python2 
    # 
    # FILE:  SO_33290969.py 
    # CREATED: 2015-10-28 
    __CHANGED__="2015-11-02 17:54:55" 
    __VERSION__=1.1 

    import Tkinter as tk 
    import ttk 

    from Tkinter import * 

    class some_Class(tk.Frame): 
     def __init__(self, *args, **kwargs): 
      tk.Frame.__init__(self, *args, **kwargs) 
      self.master=args[0] 
      self.grid() 

      self.some_function() 

     def some_function(self): 
      self.tree = ttk.Treeview(self.master) 
      ttk.Style().configure("displayField", background="#850664", foreground="#000000", fieldbackground="#FFFFFF") 
      ysb = ttk.Scrollbar(self.master, command=self.tree.yview, orient=tk.VERTICAL) 
      xsb = ttk.Scrollbar(self.master, command=self.tree.xview, orient=tk.HORIZONTAL) 
      self.tree.configure(yscrollcommand=ysb.set) 
      self.tree.configure(xscrollcommand=xsb.set) 

      self.tree["columns"]=("trackNumber", "trackTitle", "artistCat", "artistDisplay", "trackArtist", "album", 
           "albumLabel", "composer", "year", "trackDuration", "albumAsin", "albumItunes", "ISRC", 
           "filename", "albumCoverName", "notes") 
      self.tree.column("trackNumber", stretch=0, anchor=N) 
      self.tree.column("trackTitle", stretch=0, anchor=N) 
      self.tree.column("artistCat", stretch=0, anchor=N) 
      self.tree.column("artistDisplay", stretch=0, anchor=N) 
      self.tree.column("trackArtist", stretch=0, anchor=N) 
      self.tree.column("album", stretch=0, anchor=N) 
      self.tree.column("albumLabel", stretch=0, anchor=N) 
      self.tree.column("composer", stretch=0, anchor=N) 
      self.tree.column("year", stretch=0, anchor=N) 
      self.tree.column("trackDuration", stretch=0, anchor=N) 
      self.tree.column("albumAsin", stretch=0, anchor=N) 
      self.tree.column("albumItunes", stretch=0, anchor=N) 
      self.tree.column("filename", stretch=0, anchor=N) 
      self.tree.column("albumCoverName", stretch=0, anchor=N) 
      self.tree.column("notes", stretch=0, anchor=N) 
      self.tree.heading("trackNumber", text="Track Number") 
      self.tree.heading("trackTitle", text="Track Title") 
      self.tree.heading("artistCat", text="Artist CAT") 
      self.tree.heading("artistDisplay", text="Artist Display") 
      self.tree.heading("trackArtist", text="Track Artist") 
      self.tree.heading("album", text="Album") 
      self.tree.heading("albumLabel", text="Album Label") 
      self.tree.heading("composer", text="Composer") 
      self.tree.heading("year", text="Year") 
      self.tree.heading("trackDuration", text="Track Duration") 
      self.tree.heading("albumAsin", text="Album ASIN") 
      self.tree.heading("albumItunes", text="Album iTunes") 
      self.tree.heading("ISRC", text="ISRC") 
      self.tree.heading("filename", text="File Name") 
      self.tree.heading("albumCoverName", text="Album Cover Filename") 
      self.tree.heading("notes", text="Notes") 
      self.tree.grid(in_=self.master, row=0, column=0, sticky=tk.NW+tk.SE) 
      ysb.grid(in_=self.master, row=0, column=1, sticky=tk.NS) 
      xsb.grid(in_=self.master, row=1, column=0, sticky=tk.EW) 
      self.master.rowconfigure(0, weight=1) 
      self.master.columnconfigure(0, weight=1) 

      self.loadUI() 

     def loadUI(self, event=None): 
      tk.Button(self.master, text="filter columns", command=self.some_other_function).grid(row=2, column=0) 
      tk.Button(self.master, text="load data", command=self.loadData).grid(row=2, column=1) 

     def loadData(self, event=None): 
      self.tree.insert("", tk.END, values=(["data%s"%col for col in self.tree["columns"]])) 

     def some_other_function(self): 
      if len(self.tree["displaycolumns"]) != 2: 
       print("Hiding Columns") 
       self.tree["displaycolumns"]=("artistCat", "artistDisplay") 
      else: 
       print("Showing all columns") 
       self.tree["displaycolumns"]=self.tree["columns"] 

      print("Visible: %s"%','.join([ "%s"%col for col in self.tree["displaycolumns"] ])) 
      print("Available: %s"%','.join([ "%s"%col for col in self.tree["columns"] ])) 
      print("Done.") 

    if __name__=="__main__": 
      root=tk.Tk() 
      app=some_Class(root) 
      app.grid() 
      root.mainloop() 

+0

我试图做的是。它打破了我的树。我失去了滚动的能力,弄乱了它放置在窗口中的方式。 – terratunaz

+0

不幸的是,我不能再次测试这个问题,因为你上面发布的代码不包含“stationBuilderMenuMiddleFrame” - 所以检查滚动问题是不可能的。 – R4PH43L

+1

我修改了代码示例。 – R4PH43L