2016-11-06 2 views
1

Для некоторых процессов в моем приложении я использую Интернет для получения некоторых данных. Поэтому для обработанных я хочу, чтобы в начале процесса появилось простое всплывающее окно (с текстом Загрузка ...), но когда я запустил тестовый код, я заметил, что всплывающее окно отображается в конце процесса, а чем в начале процесса, что делает его бесполезным. Вот тестовый код, который я использую. Ваша помощь приветствуется, спасибо.kivy popup, отображающийся в конце текущего процесса

class ScreenManagement(ScreenManager): 
    def popup(self): 
     self.pop_up=Popup(title='Loading...') 
     self.pop_up.open() 

    def popup_done(self): 
     self.pop_up.dismiss() 

    def ite(self): 
     for i in range(100): 
      App.get_running_app().root.current='second' 
      return i 

    def thread_it(self,fx): 
     self.popup() 
     mythread = threading.Thread(target=fx) 
     mythread.start() 

    def ite(self,num): 
     for i in range(num): 
      txt=str(i)*40 
      self.ids.lbl.text=txt 
      print txt 
      #if i==num-1: #this is not working 
      # self.popup_done() 

class labelApp(App): 

    def build(self): 
     pass 

labelApp().run() 

.kv файл

ScreenManagement: 
    Screen: 
     BoxLayout: 
      Button: 
       #on_press:root.popup() 
       #on_release:root.popup_done() 
       on_press:root.thread_it(root.ite(40000)) 
       on_press:root.current='second' 

    Screen: 
     name:'second' 
     BoxLayout: 
      Label: 
       id:lbl 
       text: 'hello' 

ответ

2

Проблема с вашим методом ScreenManagement.ite(). Это не запустите в нитке, и вы уже заметили, что все, что может конкурировать с основным контуром Киви и не работает в Thread, заморозит основной цикл. У Kivy есть Clock, которые могут вас заинтересовать.

Для этого точного кода вам понадобится partial, который закроет функцию во времени и вернет вещь, которую вы можете передать как аргумент, чтобы она не была выполнена на месте, где вы хотите добавить ее как аргумент в функцию потока (например, если ite() средства выполнения, partial удалит эти скобки и пусть Thread добавить их, когда это необходимо)

Thread(target=fx) означает, что после прохождения методы ite() в основном это:

Thread(target=root.ite(40000)) 

I. Е. Запускает эту вещь на месте и, как ite() метод не возвращает ничего, он будет делать это:

# freeze main loop 
# after done, call Thread 
Thread(target=None) 

и запускает его. Таким образом, вы замораживаете свою основную петлю и после окончания ite()Popup получает свою очередь, чтобы появиться. Давайте исправить это с помощью partial:

#:import partial functools.partial 
<ScreenManagement>: 
    Screen: 
     BoxLayout: 
      Button: 
       #on_press:root.popup() 
       #on_release:root.popup_done() 
       on_press: root.thread_it(partial(root.ite,400)) 
       on_press: root.current='second' 
+0

Спасибо, это решает мою проблему! – Linh

Смежные вопросы