我使用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()
答案 0 :(得分:1)
您的代码中有几处需要修复。
首先,您定义了函数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()