使用 Frame 的 Tkinter 进度条

Tkinter progess bar using Frame

我在 Tkinter 中有一个进度条,但我可以弄清楚如何在使用 def open

加载文件之前设置最大值(=加载的文件数)
from Tkinter import *
import tkFileDialog
import ttk


class MainWindow(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.title("FOO progress bar")

        self.grid(sticky=W+N+S+E)

        top = self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        top_frame = Frame(self)
        frame_1 = Frame(self)

        top_frame.grid(row=0, sticky=W+N+S+E)
        frame_1.grid(row=1, sticky=W+N+S+E)

        top_frame.grid(row=0, sticky=W+N+S+E)

        self.open = Button(top_frame, text="Input file(s)",
                           command=self.open,
                           activeforeground="red", width=20)
        self.open.grid(row=1, column=0, pady=2, padx=2, sticky=W)

        self.progressbar = ttk.Progressbar(top_frame, orient=HORIZONTAL, length=228, mode='determinate')
        self.progressbar.grid(row=1, column=1, pady=2, padx=2, sticky=W)

        self.process = Button(frame_1, text="process",
                           command=self.process,
                           activeforeground="red", width=20)
        self.process.grid(row=2, column=0, sticky=W+N+S+E)

    def open(self):
        self.filename_open = tkFileDialog.askopenfilenames(defaultextension='*.*')
        return self.filename_open

    def process(self):
        for index, image_name in enumerate(self.filename_open.split()):
            self.progressbar.step(index)
            self.update()

if __name__ == "__main__":
   d = MainWindow()
   d.mainloop()

您可以通过 configure 更改 maximum 设置。我也修正了两三个错误。

import time

    #in __init__
    self.progressvar = IntVar()
    self.progressbar = ttk.Progressbar(top_frame, orient=HORIZONTAL, length=228, mode='determinate', variable = self.progressvar)

def open(self):
    self.filename_open = tkFileDialog.askopenfilenames(defaultextension='*.*')
    self.progressvar.set(0)

def process(self):
    self.progressbar.configure(maximum = len(self.filename_open) + 0.001) #0.001 needed to avoid progressbar empty at the end
    for index, image_name in enumerate(self.filename_open):
        self.progressbar.step(1)
        self.update_idletasks()
        time.sleep(0.5) # replace with the real process function