进度条线程问题

时间:2019-05-02 04:06:04

标签: python python-3.x tkinter ttk

我使用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()

1 个答案:

答案 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()
相关问题