2015-10-22 4 views
1

Я создал TreeView, но я хочу, чтобы иметь возможность скрывать определенные столбцы при вызове определенных функций. Таким образом, этот TreeView сначала создается, но когда я вызываю функцию, можно сказать, что все столбцы скрыты, за исключением [trackArtist]. Как мне это сделать? Я могу заставить его работать, переписав части TreeView (столбцы, которые я хочу появиться) внутри функции, но это кажется ужасно избыточным.Скрытие столбцов TreeView в Tkinter

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

Смежные вопросы