Как создать индикатор выполнения, отслеживающий ход подпроцесса в tkinter с многопоточностью - PullRequest
0 голосов
/ 06 мая 2019

В настоящее время я программирую 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
...