2010-05-16 3 views
1

아래 코드에 문제가 있습니다. 내가 그것을 실행할 때 진행 막대는 의미하는 것에 따라 약 10 초 동안 펄스를 보내고, 계속 전진 할 것이다. 그러나 끝내면 그것은 단지 잠그는 다음 단계로 나아 가지 않을 것이다.Python progressBars로 4 단계 설정

while gtk.events_pending(): 
    gtk.main_iteration() 

가이 일을 더 나은 방법이 있나요 :

import sys 
import time 
import pygtk 
import gtk 
import gobject 
import threading 
import urllib 
import urlparse 

class WorkerThread(threading.Thread): 

    def __init__ (self, function, parent, arg = None): 
     threading.Thread.__init__(self) 
     self.function = function 
     self.parent = parent 
     self.arg = arg 
     self.parent.still_working = True 

    def run(self): # when does "run" get executed? 
     self.parent.still_working = True  
     if self.arg == None: 
      self.function() 
     else: 
      self.function(self.arg) 

     self.parent.still_working = False  

    def stop(self): 
     self = None 

class MainWindow: 
    def __init__(self): 
     gtk.gdk.threads_init() 
     self.wTree = gtk.Builder() 
     self.wTree.add_from_file("gui.glade") 
     self.mainWindows() 

    def mainWindows(self): 
     self.mainWindow = self.wTree.get_object("frmMain") 

     dic = { 
      "on_btnNext_clicked" : self.mainWindowNext, 
     } 
     self.wTree.connect_signals(dic) 

     self.mainWindow.show() 
     self.installerStep = 0 # 0 = none, 1 = preinstall, 2 = download, 3 = install info, 4 = install 
     #gtk.main() 
     self.mainWindowNext() 

    def pulse(self): 
     self.wTree.get_object("progress").pulse() 

     if self.still_working == False: 
      self.mainWindowNext() 

     return self.still_working 

    def preinstallStep(self): 
     self.wTree.get_object("progress").set_fraction(0) 
     self.wTree.get_object("btnNext").set_sensitive(0) 
     self.wTree.get_object("notebook1").set_current_page(0) 
     self.installerStep = 1 
     WT = WorkerThread(self.heavyWork, self) #Would do a heavy function here like setup some thing 
     WT.start() 

     gobject.timeout_add(75, self.pulse) 

    def downloadStep(self): 
     self.wTree.get_object("progress").set_fraction(0) 
     self.wTree.get_object("btnNext").set_sensitive(0) 
     self.wTree.get_object("notebook1").set_current_page(0) 
     self.installerStep = 2 
     urllib.urlretrieve('http://mozilla.mirrors.evolva.ro//firefox/releases/3.6.3/win32/en-US/Firefox%20Setup%203.6.3.exe', '/tmp/firefox.exe', self.updateHook) 

     self.mainWindowNext() 

    def updateHook(self, blocks, blockSize, totalSize): 
     percentage = float (blocks * blockSize)/totalSize 
     if percentage > 1: 
      percentage = 1 

     self.wTree.get_object("progress").set_fraction(percentage) 

     while gtk.events_pending(): 
      gtk.main_iteration() 

    def installInfoStep(self): 
     self.wTree.get_object("btnNext").set_sensitive(1) 
     self.wTree.get_object("notebook1").set_current_page(1) 
     self.installerStep = 3 

    def installStep(self): 
     self.wTree.get_object("progress").set_fraction(0) 
     self.wTree.get_object("btnNext").set_sensitive(0) 
     self.wTree.get_object("notebook1").set_current_page(0) 
     self.installerStep = 4 

     WT = WorkerThread(self.heavyWork, self) #Would do a heavy function here like setup some thing 
     WT.start() 

     gobject.timeout_add(75, self.pulse) 

    def mainWindowNext(self, widget = None): 
     if self.installerStep == 0: 
      self.preinstallStep() 
     elif self.installerStep == 1: 
      self.downloadStep() 
     elif self.installerStep == 2: 
      self.installInfoStep() 
     elif self.installerStep == 3: 
      self.installStep() 
     elif self.installerStep == 4: 
      sys.exit(0) 

    def heavyWork(self): 
     time.sleep(10) 

if __name__ == '__main__': 
    MainWindow() 
    gtk.main() 

나는 그 무언가가 함께 할 수있는 느낌이?

+0

줄마다 2 칸 간격으로 편집 할 수 없으며 제목을 "4"대신 "for"로 편집 할 수 있습니까? –

+0

4는 설정에서 4 단계가 있기 때문에 "for"가 아닌 "4"용입니다. Yer은 공백을 변경할 수 있습니다. 게시 할 때 편집기에서 이중 간격을 두지 않았습니다. –

+0

잠깐만 기다려주세요. 파이썬 4가 끝났고 여전히 파이썬 2에 붙어 있습니까? ... 오 맞아. : ( – badp

답변

1

가이 작업을 수행하지 마십시오

while gtk.events_pending(): 
    gtk.main_iteration() 

당신이 정말 당신이 무엇을하고 있는지 알지 못한다면. 당신이 정말로 있다면, 그것을 like this을 수행

def refresh_gui(delay=0.0001, wait=0.0001): 
    """Use up all the events waiting to be run 

    :param delay: Time to wait before using events 
    :param wait: Time to wait between iterations of events 

    This function will block until all pending events are emitted. This is 
    useful in testing to ensure signals and other asynchronous functionality 
    is required to take place. 

    (c) PyGTKHelpers Authors 2005-2010 
    """ 
    time.sleep(delay) 
    while gtk.events_pending(): 
     gtk.main_iteration_do(block=False) 
     time.sleep(wait) 

블록 = 거짓과 약간의 지연을 사용.

스레드를 사용하려는 경우 개인적으로 스레드를 서브 클래 싱하지 않는 것이 좋습니다 (아무런 의미가 없음). 대신 진행률 표시 줄을 업데이트하는 방법이있는 like this 접근 방식을 권합니다.

+0

답장을 보내 주셔서 감사합니다. 나중에 집에 도착했을 때 조언을 구할 것입니다. 노력을 기울일 때 모든 희망을 거의 포기하고있었습니다. –