kivy的屏幕拒绝更新

时间:2016-11-09 16:24:31

标签: python kivy

我需要使用一些小部件来更新我的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)

1 个答案:

答案 0 :(得分:0)

Kivy不是线程安全的。如果你想触摸与小部件相关的任何东西,你必须从kivy的循环中调用它。线程应仅用于数据收集。

所以:

  1. 从外部来源收集数据。
  2. 完成后,使用Clock.schedule_once(lambda dt: callback(data))刷新GUI,其中callback是窗口小部件操作函数,data是要显示的收集数据。