2011-02-08 74 views
2

我有一個從目錄獲取文件並將其放入列表的進程。然後它在循環中迭代該列表。循環的最後一行是它應該更新我的GUI顯示的地方,然後再次使用列表中的下一項開始循環。直到整個過程完成後,Python GUI纔會更新

我的問題是,它並沒有實際更新gui,直到整個過程完成,這取決於列表的大小可能是30秒到一分鐘。這給了程序被「掛起」的感覺

我想要做的是處理列表中的一行,更新gui然後繼續。我哪裏做錯了?更新列表的行是#使用驅動器內容填充列表視圖。打印語句僅用於調試。

def populateList(self): 
    print "populateList" 

    sSource = self.txSource.Value 
    sDest = self.txDest.Value 

    # re-intialize listview and validated list 
    self.listView1.DeleteAllItems() 
    self.validatedMove = None 
    self.validatedMove = [] 

    #Create list of files 
    listOfFiles = getList(sSource)  

    #prompt if no files detected 
    if listOfFiles == []: 
     self.lvActions.Append([datetime.datetime.now(),"Parse Source for .MP3 files","No .MP3 files in source directory"]) 

    #Populate list after both Source and Dest are chosen 
    if len(sDest) > 1 and len(sDest) > 1:  
     print "-iterate listOfFiles" 

     for file in listOfFiles: 
      sFilename = os.path.basename(file) 
      sTitle = getTitle(file) 
      sArtist = getArtist(file) 
      sAlbum = getAblum(file) 

      # Make path = sDest + Artist + Album 
      sDestDir = os.path.join (sDest, sArtist) 
      sDestDir = os.path.join (sDestDir, sAlbum) 

      #If file exists change destination to *.copyX.mp3 
      sDestDir = self.defineDestFilename(os.path.join(sDestDir,sFilename)) 

      # Populate listview with drive contents  
      self.listView1.Append([sFilename,sTitle,sArtist,sAlbum,sDestDir]) 

      #populate list to later use in move command 
      self.validatedMove.append([file,sDestDir]) 
      print "-item added to SourceDest list" 
    else: 
     print "-list not iterated" 

回答

3

這是GUI程序的常見問題。在收到並處理「重繪」命令之前,控件不會得到更新,並且只有在函數返回時纔會發生。

可以強制控制通過調用其Update方法在任何時候重新繪製,如圖所示在回答這個問題:How do you force refresh of a wx.Panel?

+0

我對python非常陌生,所以無法獲取更新方法。我嘗試在append命令之後插入self.Update()的幾個變體。其中一些造成錯誤,另一些沒有可見的影響。你能給我一個額外的推動嗎? – ccwhite1

+0

我不知道爲什麼,但一些繼續玩self.Update()後開始工作。但現在它更新了,雖然它的處理我無法使用滑塊。有關於此的任何想法? – ccwhite1

4

創建一個工作線程/進程,在後臺進行處理並在處理完成後更新GUI,可能在工作期間報告進度。

查看threadingmultiprocessing模塊。

0

我可能會建議您嘗試wx.lib.delayedresult。這是簡化的多線程解決方法。您可以將您的業務邏輯放入輔助函數和其他邏輯(包括GUI附加,更新)中。 worker函數在另一個線程中運行,而consumer函數在主線程中的worker函數完成後保證運行。

相關問題