2017-06-21 25 views
0

我一直坚持在这个相同的问题上短短一周现在: 程序应该添加基于http请求的小部件。但是,该请求可能需要一些时间,具体取决于用户的互联网连接,所以我决定对该请求进行线索处理,并添加一个微调器以指示正在进行的操作。Kivy:从另一个线程添加小部件

这就是问题所在。某段代码:

@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提出另一种选择来提出请求?

谢谢!

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

+0

如果在主线程中进行所有操作,即'active = False',会发生什么? – syntonym

+1

可能值得查看kivy urlrequest模块https://kivy.org/docs/api-kivy.network.urlrequest.html – PalimPalim

+0

@syntonym不幸的是,无法看到微调旋转。 active = True - > HTTP请求冻结GUI - > active = False –

回答

0

这里的问题很简单,小部件也必须在mainthread中创建。

创建另一个用@mainthread追加的函数,并从线程函数中调用它来解决问题。

感谢那些贡献。