В настоящее время я программирую GUI с помощью tkinter в Python 3.6 для другой Программы, которая вызывается через подпроцесс.Я хотел бы представить информацию о ходе выполнения Программы с помощью индикатора выполнения, который появляется в другом окне, как только я нажимаю кнопку «Запустить программу».Значение индикатора выполнения задается аргументами, передаваемыми из сценария подпроцесса, где я вычисляю процент выполнения функции.Что мне нужно: 1. Как правильно использовать Threading-Module для запуска подпроцесса?2. Как мне импортировать функцию (и, следовательно, ее аргументы) скрипта, которая работает с параметрами командной строки?Я весь день искал ответ в других постах, но не мог связать их с моей проблемой.
Я пытался порождать подпроцесс, просто вызывая его функцию с threading.Thread(target=self.runProgram()).start()
Видимо, с GUI-программойвсе еще ожидает завершения подпроцесса / потока, а затем продолжает создание индикатора выполнения, но я ожидал, что это произойдет одновременно.Затем я попытался импортировать процентное значение подпроцесса-программы, которое не работало из-за пропущенных параметров.Также я не думаю, что это действительно сработает так, как я хочу, потому что я хочу, чтобы аргументы передавались во время выполнения, когда вызывается подпроцесс.Очень сложно правильно объяснить, что я ищу, поэтому вот код:
GUI-программа:
import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter.filedialog import askdirectory,askopenfilename
import os,subprocess
import threading
class eodApplication(tk.Tk):
def __init__(self):
#different entryboxes are created, not necessary for understanding
self.runButton=''
self.progress=''
self.window = tk.Tk()
self.window.geometry("500x350")
self.window.configure(background="white")
self.window.title("End of Day Application")
self.create_widgets()
def create_widgets(self):
#creating entryboxes initiated in __init__-method, containing paths one can browse for and a submit/'Run Program'-Button
self.submit()
def submit(self):
#Button calls function when pressed
self.runButton=ttk.Button(self.window,text='Run Program',command=lambda:self.bar_init())
self.runButton.grid(row=7, columnspan=2)
def bar_init(self):
barWindow = tk.Tk()
barWindow.geometry("250x150")
barWindow.configure(background="white")
barWindow.title("Progress")
self.progress=ttk.Progressbar(barWindow, orient="horizontal", length=200, mode="determinate",value=0)
self.progress.grid(row=0, column=0, sticky=tk.W)
threading.Thread(target=self.runProgram()).start()
from PythonProgrammeDWH import get_percentage
self.progress["value"] = percentage
def runProgram(self):
devnull = open(os.devnull, 'w')
subprocess.call(f"{self.entryboxPyExe.get()} {self.entryboxPyCode.get()} {self.entrybox64.get()} {self.entrybox66.get()} {self.entryboxXsd.get()} {self.entryboxOutput.get()} {self.entryboxXmlExe.get()}",cwd=os.getcwd(),stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL,shell=True)
eodApplication=eodApplication()
eodApplication.window.mainloop()
PythonProgrammeDWH (подпроцесс):
def main(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4]):
~ a lot of stuff going on ~
sumFiles=len(os.listdir(path))
checkedFiles=0
for file in os.listdir(path):
checkedFiles+=1
get_percentage(sumFiles, checkedFiles)
def get_percentage(sumFiles, checkedFiles):
percentage= round((checkedFiles/sumFiles)*100)
return percentage
#percentage is the argument I want to pass to the other script for updating the progressbar