2017-01-18 21 views
0

У меня есть виджет Gtk.Image в окне, и он должен менять изображение через некоторое время. запустить его в потоке функции нижеPython GTK Image, Change Image Постоянно не получает изображения после многократного использования

def dinChangeBg(self,_Timing): 
     tm.sleep(int(_Timing)) 

##  Verifica se a janela ainda existe 
     if not(self.Runing): 
      thread.exit() 

     bg = "image/background"+str(self.bgIndex)+".jpg" 

     if not (os.path.isfile(bg)): 
      print(bg,"bg inesistente") 
      self.bgIndex = 1 

      bg = "image/background"+str(self.bgIndex)+".jpg" 

     if(os.path.isfile(bg)): 
      print("new bac", bg) 

      pbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(bg, self.Window.get_size()[0],self.Window.get_size()[1], preserve_aspect_ratio=False) 
      self.image.clear() 
      self.image.set_from_pixbuf(pbuf) 
      self.bgIndex += 1 


     self.dinChangeBg(int(_Timing)) 

вызова резьбы является:

_thread.start_new_thread(dinChangeBg,(60,)) 

через некоторое время никаких изменений больше изображение и изображение desappears, печать продолжает показывать изображение если он существует.

У кого-то есть идея об ошибке?

ответ

1

Вы не можете вызвать функции GTK + из другого потока. Ваш поток должен будет сообщить GTK + thread и создать pixbuf и изменить изображение; вы говорите с GLib.idle_add(). Или, если это анимация, достаточно простая, чтобы вы могли полностью отказаться от второго потока, используйте GLib.timeout_add() для запуска кода при тайм-ауте.

+0

после попробовать его, Gtk.Window не показывать, действовать как будет открыть с тенью, автобус шоу ничего, я начал GLib нить, и делать GLib.idle_add (dinChangeBg, 60), это начать Тат протектора perfetly но window dont show – user7331387

+0

Мне нужно будет увидеть полный код. – andlabs

+0

У меня есть цикл while и time.sleep в потоке, и он прерывает программу. я изменил поток, и теперь он работает нормально. благодаря – user7331387