进度条线程问题

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()