2016-11-09 6 views
0

мне нужно обновить экран kivy с некоторыми виджетами с thread.eveything в потоке работает отлично, за исключением виджетов, которые будут обновляться на экранеЭкран kivy отказывается обновлять

<ViewScreen>: 
    id:grid 
    pic:pic 
    cols:2 
    spinner:spinner 

    MDSpinner: 
     active:False 

class ViewScreen(Screen): 
    grid = ObjectProperty(None) 
    pic = ObjectProperty(None) 
    spinner = ObjectProperty(None) 


    def load_real(self): 
     _thread.start_new_thread(self.list_files, ('name',)) 

    def list_files(self, name): 
     time.sleep(1) 
     self.ids.spinner.active = True 
     self.ids.grid.clear_widgets() 
     url = 'http://po.com/{}'.format(str(self.code_url[0])) 

     r = requests.get(url) 
     data = r.text 
     soup = BeautifulSoup(data) 
     for link in soup.find_all('a'): 
      if link.get('href').endswith('.png'): 
       print(link.get('href')) 
       self.passed.append(link.get('href')) 
       print(self.passed) 

      for photo in self.passed: 
       src = 'http://po.com/{}/{}'.format(self.code_url[0],photo) 
       print(src) 
       album = AsyncImage(source=src,) 
       self.ids.grid.add_widget(album) 
       self.spinner.active = False 
       self.code_url.pop(0) 
       print(self.code_url) 

ответ

0

Kivy не является потокобезопасным. Если вы хотите коснуться чего-либо, связанного с виджетами, вы должны вызвать его из цикла киви. Поток должен использоваться только для сбора данных.

Итак:

  1. Сбор данных от внешнего источника.
  2. По завершении работы используйте Clock.schedule_once(lambda dt: callback(data)), чтобы обновить графический интерфейс пользователя, где callback - это функция управления виджетами, а data - это собранные данные для отображения.
Смежные вопросы