2011-08-04 3 views
1

나는 계산을 수행하는 파이썬 스크립트를 가지고 있으며 팝업 wxPython 진행률 표시 줄에 대한 클래스를 만들었습니다. 현재 내가 가지고있는 것 :app.MainLoop()을 호출 한 후 wxPython 진행률 막대를 업데이트합니다.

app=wx.App() 
progress = ProgressBar() 
app.MainLoop() 

for i in xrange(len(toBeAnalysed)): 
    analyse(toBeAnalysed[i]) 
    progress.update(i/len(toBeAnalysed)*100) 

이제이 예제는 분명한 이유 때문에 작동하지 않습니다. app.MainLoop()을 다른 스레드에서 실행할 수 있지만 계산이 완료되면 진행률 (및 .update())을 전달하는 방법이 있습니까?

도움 주셔서 감사합니다.

답변

4

논리를 백그라운드 스레드에서 실행하고 wx.CallAfter을 사용하여 GUI를 주기적으로 업데이트해야합니다. CallAfter은 GUI 스레드에서 제공된 함수를 호출하므로 GUI 호출을하는 것이 안전합니다.

import wx 
import threading 
import time 

def do_stuff(dialog): # put your logic here 
    for i in range(101): 
     wx.CallAfter(dialog.Update, i) 
     time.sleep(0.1) 
    wx.CallAfter(dialog.Destroy) 

def start(func, *args): # helper method to run a function in another thread 
    thread = threading.Thread(target=func, args=args) 
    thread.setDaemon(True) 
    thread.start() 

def main(): 
    app = wx.PySimpleApp() 
    dialog = wx.ProgressDialog('Doing Stuff', 'Please wait...') 
    start(do_stuff, dialog) 
    dialog.ShowModal() 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 
관련 문제