Функции потоков и Tkinter Progress Bar - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть функция под названием анализ в другом py-файле, которая читает файл и выполняет какой-то другой анализ данных в зависимости от типа эксперимента.Я пытаюсь создать графический интерфейс для этой программы, где пользователи выбирают файл (имя файла) и тип эксперимента из раскрывающегося меню (пока не используется), а затем запускают функцию анализа на основе своих входных данных.

Я хотел, чтобы индикатор выполнения отображался, когда они нажимали кнопку запуска, чтобы пользователи знали, что он что-то делал, а затем исчезали, когда это было сделано.У меня GUI работает таким образом с некоторым тестовым кодом, который вызывается при нажатии Run.Теперь мне просто нужно сделать так, чтобы при нажатии кнопки Run вызывался анализ.Я понимаю, что мне нужно сделать это с потоками.Но я попытался выполнить многопоточность функции анализа, но ничего не происходит, так как анализ не запускается и индикатор выполнения не отображается / кнопка «Выполнить» не отключена.Иногда я получаю сообщение об ошибке:

analysis () принимает 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

1 Ответ

0 голосов
/ 20 сентября 2019

Ваша проблема с

analysis () принимает 1 позиционный аргумент, но 42 было дано

из-за ошибки форматирования.

должно быть

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

тогда я по крайней мере получил ваш код для запуска.Ничего не могу сказать о индикаторе выполнения, поскольку я не знаю, какие данные возвращает ваша функция.Может быть, обновить ответ, чтобы люди могли следить за этим.Возможно, вы можете предоставить «облегченную» версию своего кода, которая действительно выполняет какую-то работу, чтобы люди могли выяснить, как можно обновить вашу строку состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...