Python 线程功能和Tkinter进度条
我在另一个py文件中有一个名为analyze的函数,它读取一个文件,并根据实验类型对数据进行不同的分析。我正在尝试为这个程序制作一个GUI,用户可以从下拉菜单(尚未使用)中选择文件(文件名)和实验类型,然后根据输入运行分析功能 我想要一个进度条,当他们点击run按钮时显示出来,这样用户就知道它在做什么,然后在完成后消失。我让GUI以这种方式处理一些在单击Run时调用的测试代码。现在我只需要使其在单击Run时调用analyze。我知道我需要用线程来实现这一点。但是我尝试了将analyze函数线程化,什么都没有发生,因为analyze没有运行,进度条没有显示/run按钮没有被禁用。有时我会出错: analyze()接受1个位置参数,但给出了42个 关于线程是如何工作的,我肯定这是我不理解的 下面是代码的样子:Python 线程功能和Tkinter进度条,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我在另一个py文件中有一个名为analyze的函数,它读取一个文件,并根据实验类型对数据进行不同的分析。我正在尝试为这个程序制作一个GUI,用户可以从下拉菜单(尚未使用)中选择文件(文件名)和实验类型,然后根据输入运行分析功能 我想要一个进度条,当他们点击run按钮时显示出来,这样用户就知道它在做什么,然后在完成后消失。我让GUI以这种方式处理一些在单击Run时调用的测试代码。现在我只需要使其在单击Run时调用analyze。我知道我需要用线程来实现这一点。但是我尝试了将analyze函数线程化
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,以便更新进度条