Kivy:从另一个线程添加小部件

时间:2017-06-21 14:01:02

标签: multithreading interface widget kivy add

我在短短一周内就遇到了同样的问题: 程序应该根据http请求添加小部件。但是,该请求可能需要一些时间,具体取决于用户的互联网连接,因此我决定对该请求进行处理并添加一个微调器以指示正在执行某些操作。

这就是问题所在。一些代码:

@mainthread
def add_w(self, parent, widget):
    parent.add_widget(widget)

def add_course():
        # HTTP Request I mentioned
        course = course_manager.get_course(textfield_text)
        courses_stack_layout = constructor_screen.ids.added_courses_stack_layout

        course_information_widget = CourseInformation(coursename_label=course.name)

        self.add_w(courses_stack_layout, course_information_widget)

        constructor_screen.ids.spinner.active = False

从线程调用add_course,并且在调用此函数之前将spinner.active设置为True。结果如下,有时messed up graphical interface

我也试过用clock.schedule_once和clock.schedule_interval用队列来解决这个问题。结果是一样的。有时候它有效,有时它不起作用。在获得请求时,微调器会旋转,这很棒。

坦率地说,我从未想过实施一个旋转器会如此困难。

如何实现该微调器?也许是线程的另一种选择?也许是urllib提出请求的另一种方法吗?

编辑:有关我应该如何发布此消息的任何反馈,以便我可以获得更多帮助?太长了吗?也许我可以更清楚一点?

1 个答案:

答案 0 :(得分:0)

这里的问题只是必须在mainthread中创建小部件。

使用@mainthread创建另一个函数并从线程调用它解决了问题。

感谢那些贡献的人。