2017-12-05 3 views
-1

Ich mache eine GUI, die Ordner oder Datei von der Quelle zum Ziel kopieren wird. Ich muss Tree-Struktur des Verzeichnisses mit Kontrollkästchen zum Durchsuchen der Datei. Ich habe diese How to create a tree view with checkboxes in Python verwiesen aber ich habe keine Logik gefunden, um den ganzen Ordner zu erstellen. Bitte helfen Sie mir, dieses Problem zu lösen.So erstellen Sie die Struktur des Verzeichnisses mit Kontrollkästchen mit Tkinter

from tkinter import tix 

import os 
i = 0 

class View(object): 

def __init__(self, root,path): 
    self.root = root 
    self.path = path 
    self.makeCheckList(self.path) 


def makeCheckList(self,path1): 
    global i 
    self.cl = tix.CheckList(self.root, browsecmd=self.selectItem) 
    self.cl.pack(fill='both',expand="yes") 

    self.cl.hlist.add("CL1", text=path1) 
    self.cl.setstatus("CL1", "off") 
    self.check(path1) 

    self.cl.autosetmode() 

def selectItem(self, item): 
    print (item, self.cl.getstatus(item)) 

def check(self,path1): 
    global i 
    self.path1 = path1 
    file = os.listdir(path1) 
    for p in file: 
     #print(p) 
     full_path = path1 +"\\"+ p 
     val = "CL1.Item1" 
     if os.path.isdir(full_path) != True : 
      self.cl.hlist.add("CL1.Item"+ str(i), text=p) 
      self.cl.setstatus("CL1.Item"+str(i), "off") 
      i = i + 1 
    self.dir(path1)   

def dir(self,path1): 

    global i 
    self.path1 = path1 
    file = os.listdir(path1) 
    for folder in file: 
     full_path = path1 +"\\"+ folder 
     if os.path.isdir(full_path) == True :  
      self.cl.hlist.add("CL1.Item"+str(i), text=folder) 
      self.cl.setstatus("CL1.Item"+str(i), "off") 
      i = i + 1 
      #self.dir(full_path) 


def main(): 
    root = tix.Tk() 
    root.geometry("800x400") 
    view = View(root,"C:\\") 
    root.update() 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Meine Logik ist nicht korrekt here.I eine rekursive Funktion wollen die

+0

Post minimaler Code, den du arbeitest mit –

+0

ja warte ....... – python

Antwort

1

ganze Verzeichnis erstellen, wenn Sie einen Baum des Inhalts eines Verzeichnisses machen möchten, müssen Sie in der Tat ein rekursive Funktion. Für jedes Element des Verzeichnisses, in dem Baum steckte es zuerst und dann, wenn es ein Verzeichnis ist, erneut die Funktion:

def check(self, parent, path): 
    content = os.listdir(path) 
    for i, item in enumerate(content): 
     full_path = os.path.join(path, item) # item absolute path 
     entry = "{}.Item{}".format(parent, i) # item path in the tree 
     self.cl.hlist.add(entry, text=item) # add item in the tree 
     self.cl.setstatus(entry, "off") 
     if os.path.isdir(full_path): 
      # reapply the function if the item is a directory 
      self.check(entry, full_path) 

In dieser Funktion muss ich Pfad sowohl des absoluten übergeordnete Verzeichnis verfolgen und sein Weg im Baum.

, dann den Baum zu erzeugen, verwenden Sie die makeCheckList Methode:

def makeCheckList(self): # no need of any extra argument here 
    self.cl = tix.CheckList(self.root, browsecmd=self.selectItem) 
    self.cl.pack(fill='both',expand="yes") 
    # add the root directory in the tree 
    self.cl.hlist.add("CL1", text=self.path) 
    self.cl.setstatus("CL1", "off") 
    # build the tree 
    self.check("CL1", self.path) 

    self.cl.autosetmode()  

Wenn Sie Python 3.5 oder höher verwenden, können Sie os.listdir durch os.scandir ersetzen Ihr Programm zu beschleunigen:

def check(self, parent, path): 
    with os.scandir(path) as content: 
     for i, item in enumerate(content): 
      entry = "{}.Item{}".format(parent, i) 
      self.cl.hlist.add(entry, text=item.name) 
      self.cl.setstatus(entry, "off") 
      if item.is_dir(): 
       self.check(entry, item.path) 
+0

Vielen Dank. Kannst du mir irgendeinen Link geben, wo ich alle Befehle von tix finden kann, wenn ich auf irgendeinen Gegenstand klicke, sollte er mir seinen Wert geben (Weg) und wenn ich Überprüfen Sie auf einem übergeordneten Verzeichnis sollte es alle seine untergeordneten Pfad überprüfen – python

+0

@python Ich verwende 'tix' nicht und ich kenne keinen Link zu seiner Dokumentation. Ich habe jedoch eine 'CheckboxTreeview' aus' ttk.Treeview' implementiert (es ist die zweite Antwort auf https://stackoverflow.com/questions/5104330/how-to-create-a-tree-view-with-checkboxes) -in-python), die die Überprüfung bereits an die untergeordneten Elemente weitergibt. –

+0

Ich habe den Code, um alle zu überprüfen, aber wenn ich Name des Kontrollkästchens dann ausdrucken möchte, wie es geht? – python

Verwandte Themen