2014-09-22 5 views
0

주 창에있는 진행률 막대를 다른 서브 루틴에서 수행중인 작업의 진행률로 업데이트하고 싶습니다. 그리고 나는에 대해 별도의 파일을 것서브 루틴에서 진행률 표시 줄 업데이트

import Calculations 

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

: 내 Mainwindow.py에서

내가 좋아하는 뭔가를 할 것이다 :

내가이 개 파일이 것, 가능한 한 명확하게하려면 계산 : 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) 

CalculationsprogressBar를 업데이트합니다.

  • 당신은 아마 longIteration은 그 이름에서 알 수 있듯이, 당신이있어, 장기 실행 함수는
  • 경우에 대해 아는 안 사람, Calculations와 GUI 코드를 혼합하고이하지만 두 가지 문제를 가지고 GUI 메인 스레드를 막아서 많은 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

안녕 Goncalopp, thanks fo r 당신의 대답. 첫 번째 옵션에 대해 옳습니다. 내게 더 쉽게 보이기 때문에 첫 번째 옵션을 사용했지만, MainWindow가 응답하지 않게되어 progressBar가 루프가 끝날 때까지 업데이트되지 않습니다. 그래서 내 두 번째 옵션, 스레드와 함께 내 문제는 스레드에서 루프의 진행률로 progressBar를 업데이트하는 방법을 완전히 이해하지 못한다는 것입니다. – codeKiller

+1

@newPyUser 'longIteration'에서 콜백을 호출해야합니다. 나는 그것을 분명하게하기 위해 질문을 편집했다. – goncalopp

+0

다시 한번 고마워, 나는 그것을 잘 보이게하려고 노력할 것이다, 좋아 보인다! – codeKiller

관련 문제