2014-09-22 2 views
0

Я хотел бы обновить индикатор выполнения, который у меня есть в главном окне с прогрессом задачи, которую я выполняю в другой подпрограмме, было бы возможно?Обновить индикатор выполнения из подпрограммы

Чтобы быть ясно, как это возможно, я бы 2 файла:

В моей Mainwindow.py Я бы иметь что-то вроде:

import Calculations 

#some code 
self.ui.progressBar 
Calculations.longIteration("parameters") 

Тогда я должен был бы отдельный файл для расчеты: Calculations.py

def longIteration("parameters") 

#some code for the loop 

"here I would have a loop running" 
"And I would like to update the progressBar in Mainwindow" 

возможно ли это?

Или это должно быть сделано по-другому?

Спасибо.

ответ

1

Самый простой из методов было бы просто передать объект GUI:

self.ui.progressBar 
Calculations.longIteration("parameters", self.ui.progressBar) 

и обновить progressBar на Calculations. Это имеет две проблемы, хотя:

  • Вы смесительные код GUI с Calculations, который, вероятно, не должен ничего об этом
  • если longIteration длинный ход функции, как следует из ее названия, вы знаете, блокируя основной поток графического интерфейса пользователя, что сделает многие графические интерфейсы GUI недовольными (и ваше приложение не отвечает).

Другое решение работает longIteration в потоке, и передать функцию обратного вызова, которая используется для обновления прогресса:

import threading 
def progress_callback(): 
    #update progress bar here 
threading.Thread(target=Calculations.longIteration, args=["parameters", progress_callback]).run() 

затем, внутри longIteration, делают:

def longIteration(parameters, progress_callback): 
    #do your calculations 
    progress_callback() #call the callback to notify of progress 

Вы можете изменить progress_callback, чтобы принять аргументы, если они вам понадобятся, очевидно

+0

Hi Goncalopp, thanks fo Ваш ответ. Вы правы в первом варианте. Я взял этот первый вариант, потому что мне было легче, но, да, MainWindow становится невосприимчивым, поэтому progressBar не обновляется до конца цикла. Таким образом, моя проблема с вашей второй опцией, с потоком, заключается в том, что я не совсем понимаю, как обновить progressBar с ходом цикла из потока – codeKiller

+1

@newPyUser Вам нужно вызвать обратный вызов из 'longIteration'. Я отредактировал вопрос, чтобы было ясно, – goncalopp

+0

еще раз спасибо, я постараюсь сделать все, работает хорошо! – codeKiller