进度条线程问题
Issue with progress bar thread
我使用 Tkinter 创建了一个小型 GUI。它有一个按钮,点击它可以将一些数据写入 Excel。
为了显示进度,我添加了一个进度条,但由于该过程是资源密集型的,所以进度条只出现在最后。因此,我使用了如图所示的线程。
在下面的 Main 函数中,我在另一个线程中初始化了进度条,但我想在 Start 函数中更新任务的当前值。
因为这一行:
progressbar.Start()
只是一直运行,与当前进度无关
def Start():
x = 0
progressbar["value"] = x
for idx, val in enumerate(rows):
region_url = val[1]
if (model_url != '-'):
url = 'http://testurl/' + region_url
x = x + 1
if (x > 4):
break
# Main
if __name__ == '__main__':
window = Tk()
new = progress(window)
# Add a grid
mainframe = Frame(window)
mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
mainframe.pack(pady = 100 , padx = 150)
# DropDown
popupMenu = OptionMenu(mainframe, tkvar, *regionList)
Label(mainframe, text="Region").grid(row = 1, column = 0)
# Button
btnSubmit = Button(mainframe, text= "Execute",command=StartScrap).grid(row = 2, column = 18)
popupMenu.grid(row = 2, column =0)
# Progress Bar
progressbar = ttk.Progressbar(window, orient = HORIZONTAL,length=300, mode = 'indeterminate')
progressbar.pack()
t = threading.Thread()
progressbar["maximum"] = 4
progressbar.start()
window.mainloop()
您的代码中有几处需要修复。
首先,您定义了函数 Start
来控制进度条的更新方式,但您从未调用过它。
其次,您将进度条模式定义为 indeterminate
,并且只是 start
进度条 - 它可以工作,但它只会定期移动进度条。
第三,您定义了线程 t
但从未放置目标函数。
以下是在线程中移动进度条的方法:
from tkinter import *
from tkinter import ttk
import threading
import time
def Start():
def update_pbar():
for i in range(5): #replace this with your method to update your progressbar
time.sleep(1)
progressbar["value"] = i
t = threading.Thread(target=update_pbar)
t.start()
# Main
if __name__ == '__main__':
window = Tk()
progressbar = ttk.Progressbar(window, orient = HORIZONTAL,length=300, mode = 'determinate')
progressbar.pack()
progressbar["maximum"] = 4
btnSubmit = Button(window, text="Execute", command=Start).pack()
window.mainloop()
我使用 Tkinter 创建了一个小型 GUI。它有一个按钮,点击它可以将一些数据写入 Excel。
为了显示进度,我添加了一个进度条,但由于该过程是资源密集型的,所以进度条只出现在最后。因此,我使用了如图所示的线程。
在下面的 Main 函数中,我在另一个线程中初始化了进度条,但我想在 Start 函数中更新任务的当前值。
因为这一行:
progressbar.Start()
只是一直运行,与当前进度无关
def Start():
x = 0
progressbar["value"] = x
for idx, val in enumerate(rows):
region_url = val[1]
if (model_url != '-'):
url = 'http://testurl/' + region_url
x = x + 1
if (x > 4):
break
# Main
if __name__ == '__main__':
window = Tk()
new = progress(window)
# Add a grid
mainframe = Frame(window)
mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
mainframe.pack(pady = 100 , padx = 150)
# DropDown
popupMenu = OptionMenu(mainframe, tkvar, *regionList)
Label(mainframe, text="Region").grid(row = 1, column = 0)
# Button
btnSubmit = Button(mainframe, text= "Execute",command=StartScrap).grid(row = 2, column = 18)
popupMenu.grid(row = 2, column =0)
# Progress Bar
progressbar = ttk.Progressbar(window, orient = HORIZONTAL,length=300, mode = 'indeterminate')
progressbar.pack()
t = threading.Thread()
progressbar["maximum"] = 4
progressbar.start()
window.mainloop()
您的代码中有几处需要修复。
首先,您定义了函数 Start
来控制进度条的更新方式,但您从未调用过它。
其次,您将进度条模式定义为 indeterminate
,并且只是 start
进度条 - 它可以工作,但它只会定期移动进度条。
第三,您定义了线程 t
但从未放置目标函数。
以下是在线程中移动进度条的方法:
from tkinter import *
from tkinter import ttk
import threading
import time
def Start():
def update_pbar():
for i in range(5): #replace this with your method to update your progressbar
time.sleep(1)
progressbar["value"] = i
t = threading.Thread(target=update_pbar)
t.start()
# Main
if __name__ == '__main__':
window = Tk()
progressbar = ttk.Progressbar(window, orient = HORIZONTAL,length=300, mode = 'determinate')
progressbar.pack()
progressbar["maximum"] = 4
btnSubmit = Button(window, text="Execute", command=Start).pack()
window.mainloop()