Tkinter 进度条无法正常工作

时间:2021-07-20 08:16:10

标签: python tkinter progress-bar

我正在尝试向我的窗口添加进度条,直到完成一些工作。但它不能正常工作。我希望它一直移动直到工作完成,但它只是快速移动然后停止。此外,如果我尝试最小化或关闭进度窗口,它只会挂起并停止响应。 任何人都可以帮助我如何正确地做到这一点?这是我的代码。

import time
from tkinter import ttk
from tkinter import *

numbers = []

def main():
    main_window = Tk()
    app = info(main_window)
    main_window.mainloop()


class info:
    def __init__(self, root):
        # start = timer()
        self.error_str = ''
        self.root1 = root
        self.root1.title('LOADING......')
        self.root1.geometry("380x200")

        self.root1.eval('tk::PlaceWindow . center')
        self.root1.resizable(width=False, height=False)
        self.root1.configure(background='white')

        progress = ttk.Progressbar(self.root1, orient=HORIZONTAL,
                                   length=380, mode='determinate')
        progress.place(x=0, y=100)
        i = 20

        for x in range(1, 50):
            numbers.append(x * 2)
            print(numbers)

            progress['value'] = i
            self.root1.update_idletasks()
            time.sleep(0.1)
            i = i + 40

        self.root = root
        self.root.title('Second window')

        self.root.geometry('1350x800+0+0')

        frame1 = Frame(self.root, bg='#7877a5')
        frame1.place(x=0, y=0, width=1350, height=150)
        title = Label(frame1, text="Second Window", font=("Times New Roman", 40, "bold", "italic"),
                      bg='#7877a5',
                      fg='white')
        title.place(x=380, y=45)



if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

一般来说,您不应在 tkinter 应用程序中调用 time.sleep(),因为它会干扰 GUI 的 mainloop() 并使您的程序挂起或冻结。改用通用小部件方法 after()

最后,您需要为 Progressbar 指定一个最大值,以便其指标相对于您将其值设置为的 i 的值进行适当缩放。 maximum 的默认值仅为 100,您的代码在 for x 循环中大大超过了该值。

这是info.__init__() 中需要更改的代码。更改后的两行有 # ALL CAPS 条注释:

        progress = ttk.Progressbar(self.root1, orient=HORIZONTAL,
                                   length=380, mode='determinate',
                                   maximum=(48*40)+20)  # ADDED ARGUMENT.
        progress.place(x=0, y=100)
        i = 20

        for x in range(1, 50):
            numbers.append(x * 2)
            print(numbers)

            progress['value'] = i
            self.root1.update_idletasks()
            self.root1.after(100)  # Delay in millisecs.  # REPLACED TIME.SLEEP() CALL.
            i = i + 40