2016-06-10 5 views
1

У меня есть рабочий графический интерфейс с неустойчивым индикатором выполнения. Мои проблемы, по-видимому, состоят в том, что я не могу заставить индикатор выполнения правильно выполнить шаг на основе количества элементов в исходном каталоге. Есть идеи?Tkinter ProgressBar и Os.Walk в 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() 

Все работает, моя единственная проблема - переменная stepFiles. Как я могу сделать это более точным, чем то, что у меня уже есть?

Возможно, это так, как я вычисляю stepFiles? Я чувствую, что мне не хватает чего-то простого.

ответ

1

Когда вы делаете деление на Python с 2 ints, вы получите обратно int (целое число). Так, например, если у вас 27 файлов:

>>> 100/27 
3 

Теперь мы можем видеть, что есть огромная проблема здесь, так как 3 * 27 == 81. Поэтому, если мы сделаем шаг на 3 для 27 файлов, вы только закончите с 81% полным индикатором выполнения.

Вы можете исправить это путем подачи одной поплавка в ваши деления для более точного результата:

>>> 100.00/27 
3.7037037037037037 

-

Другим способом, чтобы исправить это было бы установить maximum вашего ProgressBar в self.totalFiles (после того, как вы его вычислите, конечно), а затем шаг на 1 для каждого файла.

+0

Я удалил максимум = 100 из self.progressLine, достал self.stepFiles = (100/self.totalFiles) и установил self.progressLine ["maximum"] = self.totalFiles. Но в то время как код работает, индикатор выполнения все еще кажется максимальным и перезапускается снова и снова. - Я чувствую, что слишком часто вызываю шаг? – sdavis891

+0

Все, что вам нужно было изменить, было 'self.stepFiles'' 'self.stepFiles = (100.00/self.totalFiles)' – Jkdc

+0

Если вы пошли на этот 2-й маршрут, вам также нужно было перейти на 'self.progressLine.step (1)' – Jkdc

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

  • Нет связанных вопросов^_^