2012-01-08 65 views
0

我想下載圖片並用gtk.ProgressBar()顯示進度。只有當gobject.idle_add()函數終止時纔有辦法繼續?

對於這一點,我用在PyGTK FAQ推薦的方法,它工作正常:

class MainInterface : 
    def __init__(self) : 
    ... 
    thread.start_new_thread(self.getMap,()) 

    gtk.gdk.threads_init() 
    gtk.gdk.threads_enter() 
    gtk.main() 
    gtk.gdk.threads_leave() 

    def getMap(self) : 
    ... 
    getImage = self.getImages(new_img_list) # new_img_list is a list of image paths 
    gobject.idle_add(getImage.next) 

    def getImages(self, img_list) : 
    nb_img = len(img_list) 
    i = 1.0 
    for img in img_list : 
     self.progress_interface.progress_bar.set_fraction(i/nb_img) 
     gtk.gdk.threads_enter() 
     get_maps.download_image(img) # This function downloads the current image to the disk 
     gtk.gdk.threads_leave() 
     i += 1.0 
     yield True 
    self.progress_interface.progress_bar.set_text("Les images sont à jour") 
    self.progress_interface.progress_bar.set_fraction(1) 
    yield False 

現在,我有一個ShowMap()方法,從先前下載的圖像創建gtk.Pixbuf

因此,我想在new_img_list下載所有圖像時(因此當getImage.next()返回Falsè時)將此ShowMap()函數調用。

我該如何做到這一點?

感謝

回答

1

我已經找到了解決辦法:啓動ShowMap()在一個新的線程在getImages(),像這樣:

def getImages(self, img_list) : 
    nb_img = len(img_list) 
    i = 1.0 
    for img in img_list : 
     self.progress_interface.set_progress(i, nb_img) 
     gtk.gdk.threads_enter() 
     get_maps.download_image(img) 
     gtk.gdk.threads_leave() 
     i += 1.0 
     yield True 
    self.progress_interface.progress_bar.set_text("Les images sont à jour") 
    self.progress_interface.progress_bar.set_fraction(1) 
    thread.start_new_thread(self.ShowMap,()) # Here 
    yield False 

但也許有更好的解決辦法?

編輯: 事實上,這個解決方案不適用於Windows(但適用於Linux),所以它可能不是一個適當的方式來做到這一點。

編輯2: 我終於發現還通過使用生成函數在gtk.IconView逐步添加行並將它傳遞給gobject.idle_add()溶液:

def getImages(self, img_list) : 
    nb_img = len(img_list) 
    i = 1.0 
    for img in img_list : 
     self.progress_interface.set_progress(i, nb_img) 
     gtk.gdk.threads_enter() 
     get_maps.download_image(img) 
     gtk.gdk.threads_leave() 
     i += 1.0 
     yield True 
    self.progress_interface.progress_bar.set_text("Les images sont à jour") 
    self.progress_interface.progress_bar.set_fraction(1) 
    map_loading = self.loadMap() 
    gobject.idle_add(map_loading.next) 
    yield False 

def loadMap(self, step=128) : 
    i = 1.0 
    nb_tiles = len(self.graph) * len(self.graph[0]) 
    self.grid.iconview.freeze_child_notify() 
    for row in self.graph : 
     for col in row : 
      ... 
      self.grid.listStore.append(...) 
      self.progress_interface.progressbar_map.set_fraction(i/nb_tiles) 
      self.progress_interface.progressbar_map.set_text("Chargement des tuiles en cours ...") 
      i += 1.0 
      if (i % step) == 0: 
       self.grid.iconview.thaw_child_notify() 
       yield True 
       self.grid.iconview.freeze_child_notify() 
    self.grid.iconview.set_model(self.grid.listStore) 
    self.grid.iconview.thaw_child_notify() 
    yield False 
相關問題