Python 2.7 中的 Tkinter ProgressBar 和 Os.Walk
Tkinter ProgressBar and Os.Walk in Python 2.7
我有一个工作 GUI,带有一个不稳定的进度条。我的问题似乎是我无法让进度条根据源目录中的项目数量正确步进。有什么想法吗?
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 的方式?我觉得我错过了一些简单的东西。
当你用 2 个整数在 Python 中进行除法时,你将得到一个整数(整数)。例如,如果您有 27 个文件:
>>> 100 / 27
3
现在我们可以看到这里有一个大问题,因为 3 * 27 == 81
。因此,如果我们对 27 个文件进行 3 步处理,您只会以 81% 的完整进度条结束。
您可以通过将一个浮点数输入您的除法来解决此问题以获得更准确的结果:
>>> 100.00 / 27
3.7037037037037037
--
解决此问题的另一种方法是将进度条的 maximum
设置为 self.totalFiles
(当然是在您计算之后),然后对每个文件逐步设置 1
。
我有一个工作 GUI,带有一个不稳定的进度条。我的问题似乎是我无法让进度条根据源目录中的项目数量正确步进。有什么想法吗?
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 的方式?我觉得我错过了一些简单的东西。
当你用 2 个整数在 Python 中进行除法时,你将得到一个整数(整数)。例如,如果您有 27 个文件:
>>> 100 / 27
3
现在我们可以看到这里有一个大问题,因为 3 * 27 == 81
。因此,如果我们对 27 个文件进行 3 步处理,您只会以 81% 的完整进度条结束。
您可以通过将一个浮点数输入您的除法来解决此问题以获得更准确的结果:
>>> 100.00 / 27
3.7037037037037037
--
解决此问题的另一种方法是将进度条的 maximum
设置为 self.totalFiles
(当然是在您计算之后),然后对每个文件逐步设置 1
。