Tkinter 进度条无法正常工作
Tkinter progress bar not working properly
我正在尝试向我的 window 添加进度条,直到完成一些工作。但它不能正常工作。我希望它一直移动直到工作完成,但它只是快速移动然后停止。此外,如果我尝试最小化或关闭进度 window,它就会挂起并停止响应。
任何人都可以帮助我如何正确地做到这一点?这是我的代码。
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()
一般来说,您不应在 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
我正在尝试向我的 window 添加进度条,直到完成一些工作。但它不能正常工作。我希望它一直移动直到工作完成,但它只是快速移动然后停止。此外,如果我尝试最小化或关闭进度 window,它就会挂起并停止响应。 任何人都可以帮助我如何正确地做到这一点?这是我的代码。
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()
一般来说,您不应在 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