2017-06-21 54 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追加的函數,並從線程函數中調用它來解決問題。

感謝那些貢獻。