【问题标题】:Tkinter ProgressBar and Os.Walk in Python 2.7Python 2.7 中的 Tkinter ProgressBar 和 Os.Walk
【发布时间】:2016-06-10 15:39:05
【问题描述】:

我有一个带有不稳定进度条的工作 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 的方式?我觉得我错过了一些简单的东西。

【问题讨论】:

    标签: python python-2.7 tkinter progress-bar os.walk


    【解决方案1】:

    当您在 Python 中使用 2 个整数进行除法时,您将得到一个整数(整数)。例如,如果您有 27 个文件:

    >>> 100 / 27
    3
    

    现在我们可以看到这里有一个很大的问题,因为3 * 27 == 81。因此,如果我们对 27 个文件按 3 步长,您只会以 81% 的完整进度条结束。

    您可以通过将一个浮点数输入到您的分区中来解决此问题,以获得更准确的结果:

    >>> 100.00 / 27
    3.7037037037037037
    

    --

    解决此问题的另一种方法是将进度条的maximum 设置为self.totalFiles(当然是在计算之后),然后为每个文件逐步设置1

    【讨论】:

    • 我从self.progressLine中去掉maximum=100,取出self.stepFiles=(100/self.totalFiles),设置self.progressLine["maximum"] = self.totalFiles。但是当代码运行时,进度条似乎仍然最大化并一遍又一遍地重新启动。 - 我觉得我叫 step 太频繁了?
    • 您只需将self.stepFiles 更改为self.stepFiles = (100.00/self.totalFiles)
    • 如果您选择了第二条路线,那么您还需要更改为 self.progressLine.step(1)
    • 我不得不重新调整我的一些代码以使其正确运行,但这成功了!
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多