2016-06-10 13 views
1

Ich habe eine funktionierende GUI mit einem wackeligen Fortschrittsbalken. Mein Problem scheint zu sein, dass ich den Fortschrittsbalken basierend auf der Anzahl der Elemente im Quellverzeichnis nicht korrekt ausführen kann. Irgendwelche Ideen?Tkinter ProgressBar und Os.Walk in Python 2.7

def Progress(self): 
    progress = Frame(self) 
    progress.pack(fill=X) 
    self.progressLine = ttk.Progressbar(progress, orient=HORIZONTAL, length=550, mode='determinate', maximum=100) 
    self.progressLine.pack(pady=5) 

def Scatter(self): 
    self.t_start.delete('1.0', END) 
    if Entry.get(self.sourceE) > 0 or Entry.get(self.destE) > 0: 
     if not os.path.exists(Entry.get(self.sourceE)) or not os.path.exists(Entry.get(self.destE)): 
      self.t_start.delete('1.0', END) 
      self.t_start.insert(END, '*WARNING* Missing Source and/or Destination Folders') 
      return 

    self.t_start.delete('1.0', END) 
    self.t_start.insert(END, "Counting Assets\n") 
    self.totalFiles = len(list(os.walk(os.path.abspath(Entry.get(self.sourceE))))) 
    self.stepFiles = (100/self.totalFiles) 
    self.progressLine['value'] = self.stepFiles 
    self.t_start.insert(END, "Process Started...\n") 
    #self.progressLine.step(self.stepFiles) 

    for root, subFolders, files in os.walk(Entry.get(self.sourceE)): 
     self.progressLine.step(self.stepFiles) 
     for file in files: 
      if not file.startswith('.'): 
       subFolder = os.path.join(Entry.get(self.destE), file[:1], file[:2], file [:3], file [:4]) 
       checkFile = os.path.join(subFolder, file) 
       if not os.path.isdir(subFolder): 
        os.makedirs(subFolder) 
       if not os.path.exists(checkFile): 
        shutil.move(os.path.join(root, file), subFolder) 
       else: 
        global fname, fextension 
        fname, fextension = os.path.splitext(file) 
        ii = 1 
        while True: 
         new_pname = os.path.join(subFolder, fname + "_" + str(ii) + fextension) 
         new_name = fname + "_" + str(ii) + fextension 
         if not os.path.exists(new_pname): 
          shutil.copy(checkFile, new_pname) 
          change_files = "From: " + file + " to: " + new_name + "\n" 
          self.t_start.insert(END, change_files) 
          if self.CheckVar.get() == 1: 
           delfile = os.path.join(root, file) 
           delete_files = "Deleted Original: " + file + "\n" 
           self.t_start.insert(END, delete_files) 
           os.remove(delfile) 
          break 
         ii += 1 
      self.progressLine.update_idletasks() 
    self.t_start.insert(END, "Process Complete") 
    self.progressLine.update_idletasks() 

Alles funktioniert, mein einziges Problem ist die Variable "stepFiles". Wie würde ich das genauer machen als das, was ich schon habe?

Vielleicht ist es, wie ich StepFiles berechnen? Ich fühle mich, als würde ich etwas Einfaches vermissen.

Antwort

1

Wenn Sie Division in Python mit 2 Ints tun, erhalten Sie eine int (ganze Zahl) zurück. So zum Beispiel, wenn Sie hatte 27 Dateien:

>>> 100/27 
3 

Jetzt können wir sehen, dass es ein großes Problem hier, da 3 * 27 == 81. Wenn wir also bei 27 Dateien um 3 vorgehen, enden Sie nur mit einem 81% vollen Fortschrittsbalken.

Sie können dieses Problem beheben, indem ein genaueres Ergebnis einen Schwimmer in Ihre Abteilung Fütterung:

>>> 100.00/27 
3.7037037037037037 

-

Ein anderer Weg, dies zu beheben, um die maximum Ihre progressbar self.totalFiles zu setzen wäre (nachdem du es natürlich berechnet hast) und dann für jede Datei um 1 gehen.

+0

Ich entfernte Maximum = 100 von self.progressLine, nahm self.stepFiles = (100/self.totalFiles) und setzte self.progressLine ["maximum"] = self.totalFiles. Aber während der Code ausgeführt wird, scheint der Fortschrittsbalken immer noch hochzufahren und immer wieder neu zu starten. - Ich fühle, dass ich zu oft rufe? – sdavis891

+0

Alles, was du ändern musstest, war 'self.stepFiles' zu' self.stepFiles = (100.00/self.totalFiles) ' – Jkdc

+0

Wenn du diese zweite Route benutzt hast, musst du auch zu' self.progressLine.step (1) 'wechseln – Jkdc