Python 线程功能和Tkinter进度条

Python 线程功能和Tkinter进度条,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我在另一个py文件中有一个名为analyze的函数,它读取一个文件,并根据实验类型对数据进行不同的分析。我正在尝试为这个程序制作一个GUI,用户可以从下拉菜单(尚未使用)中选择文件(文件名)和实验类型,然后根据输入运行分析功能 我想要一个进度条,当他们点击run按钮时显示出来,这样用户就知道它在做什么,然后在完成后消失。我让GUI以这种方式处理一些在单击Run时调用的测试代码。现在我只需要使其在单击Run时调用analyze。我知道我需要用线程来实现这一点。但是我尝试了将analyze函数线程化

我在另一个py文件中有一个名为analyze的函数,它读取一个文件,并根据实验类型对数据进行不同的分析。我正在尝试为这个程序制作一个GUI,用户可以从下拉菜单(尚未使用)中选择文件(文件名)和实验类型,然后根据输入运行分析功能

我想要一个进度条,当他们点击run按钮时显示出来,这样用户就知道它在做什么,然后在完成后消失。我让GUI以这种方式处理一些在单击Run时调用的测试代码。现在我只需要使其在单击Run时调用analyze。我知道我需要用线程来实现这一点。但是我尝试了将analyze函数线程化,什么都没有发生,因为analyze没有运行,进度条没有显示/run按钮没有被禁用。有时我会出错:

analyze()接受1个位置参数,但给出了42个

关于线程是如何工作的,我肯定这是我不理解的

下面是代码的样子:

import tkinter as tk
from tkinter import filedialog , messagebox, ttk
import time
from threading import Thread
from Analysis import analyze


filename=""

def browse():
    global filename
    filename = filedialog.askopenfilename()
    Name.config(text=filename)

def run():
    Run.config(state="disabled")
    bar=tk.Frame(window)
    bar.grid(column=1, row=4, pady=10)
    pb=ttk.Progressbar(bar, orient="horizontal",mode='indeterminate', length=500)
    pb.grid()
    pb.start()
#    for _ in range(50):
#        time.sleep(.1) # simulate some work   #code used to test the GUI
#        pb.step(10)
#        pb.update_idletasks()
    run_thread()
    pb.stop()
    bar.destroy()
    Run.config(state="normal")

def run_thread():
    Thread(target=analyze, args=filename).start()


window=tk.Tk()
window.geometry("750x150")

window.grid_columnconfigure(1, weight=1)

lbFrame=tk.LabelFrame(window, text="Select a file")
lbFrame.grid(column=0,row=0)
button1=tk.Button(lbFrame, text="Browse", command=browse)

button1.grid()

Name=tk.Label(window)
Name.grid(column=1,row=0, sticky="W")

Select=tk.Label(window,text="Select Experiment :")
Select.grid(column=0, row=1)

var=tk.StringVar(window)
var.set("Blood")

dropdown=tk.OptionMenu(window,var,"Blood","Multi Blood","Multi Urine")
dropdown.grid(column=1, row=1,sticky="W")

bottom=tk.Frame(window, height=850)
bottom.grid(column=1,row=3)

Run=tk.Button(bottom,text="Run", bg="green", command=run)
Run.grid()
Run.config(width=25)



window.mainloop()
而分析基本上是

def analyze(filename):
     #do some stuff
你的问题

analyze()接受1个位置参数,但给出了42个

源于格式错误

应该是

def run_thread():
    Thread(target=analyze, args=(filename,)).start()
然后我至少让你的代码运行了。不能说任何关于progressbar的内容,因为我不知道函数返回的是哪种数据。也许可以更新答案,这样人们就可以跟进。
也许您可以提供一个“轻松”版本的代码来完成一些实际工作,这样人们就可以了解如何更新状态栏。

我认为您不需要为progressbar添加线程,ttk已经可以处理它了。你只需要输入每次函数运行时它增加的值。什么值?函数没有预定的时间或步骤,这就是我使用不确定进度的原因。分析函数所做的一切是读取一个csv文件名,进行一些数据清理,用一个值减去所有列,然后将其打印到excel工作表。从技术上讲,我可以将代码分解为“步骤”,并在每个“步骤”后增加一个变量或其他内容,但在运行analyze时,如何将该信息来回传递给GUI,以便更新进度条