2010-05-16 63 views
1

我在下面的代码有问题。当我运行它时,进度条会脉冲大约10秒钟,然后继续下载并显示进度,但完成后它将不会移动到刚刚锁定的下一步。Python四步设置与进度条

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() 

我有一种感觉,它的东西用做:

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

是否有这样做的更好的办法?

+0

你可以编辑它,所以它不是每间隔行间隔两倍,标题用“for”而不是“4”? – 2010-05-16 21:29:03

+0

4代表“四个”不代表“代表”,因为它有4个步骤。你可以改变间距,它在发布时并不是在编辑器中双倍间隔的。 – 2010-05-17 08:17:03

+0

嘿,等一下? Python 4已经出来,我仍然停留在Python 2上? ... 啊对。 :( – badp 2010-05-27 22:07:55

回答

1

永远不要做:

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

除非你真的知道自己在做什么。使用块=假和一些延误

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

如果你想使用线程,我个人不会建议像这样的子类(没有意义),相反,我会建议一个方法like this它有一个更新进度条的例子。

+0

感谢您的回复,我会在晚些时候回家时尝试您的建议,我几乎放弃了所有希望努力实现目标的希望。 – 2010-05-28 10:49:06