0

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

我希望在他们单击运行按钮时显示一个进度条,以便用户知道它在做什么,然后在完成后消失。我让 GUI 以这种方式使用一些在单击“运行”时调用的测试代码。现在我只需要让它在单击运行时调用分析。我知道我需要用线程来做到这一点。但是我尝试线程化分析函数没有任何反应,因为分析没有运行并且进度条没有显示/运行按钮没有被禁用。有时我会收到错误:

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
4

1 回答 1

0

你的问题

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

源于格式错误。

应该

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

然后我至少让你的代码运行。不能说进度条,因为我不知道你的函数返回的是哪种数据。也许更新答案,以便人们可以跟进。也许你可以提供一个“轻量级”版本的代码来做一些实际的工作,这样人们就可以弄清楚你的状态栏是如何更新的。

于 2019-09-20T12:24:56.010 回答