Python kivy弹出窗口在运行进程结束时显示

Python kivy弹出窗口在运行进程结束时显示,python,kivy,Python,Kivy,对于我应用程序中的某些过程,我使用互联网获取一些数据。因此,对于那些被处理的,我希望一个简单的弹出框(带有文本加载…)出现在流程开始时,但是当我运行测试代码时,我观察到弹出框显示在流程结束时,而不是流程开始时,这使得它毫无用处。下面是我正在使用的测试代码。非常感谢你的帮助,谢谢 class ScreenManagement(ScreenManager): def popup(self): self.pop_up=Popup(title='Loading...')

对于我应用程序中的某些过程,我使用互联网获取一些数据。因此,对于那些被处理的,我希望一个简单的弹出框(带有文本加载…)出现在流程开始时,但是当我运行测试代码时,我观察到弹出框显示在流程结束时,而不是流程开始时,这使得它毫无用处。下面是我正在使用的测试代码。非常感谢你的帮助,谢谢

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'

问题在于您的
ScreenManagement.ite()
方法。它不在线程中运行,您已经注意到任何可以与Kivy的主循环竞争且不在线程中运行的东西都会冻结主循环。Kivy也有你可能感兴趣的东西

然而,对于您需要的这段代码,它将及时冻结一个函数并返回一个可以作为参数传递的内容,这样它就不会在您希望将其作为参数添加到线程函数的位置执行(例如if
ite()
意味着执行,
partial
将删除这些括号,并在必要时让
线程添加它们)

Thread(target=fx)
表示通过
ite()
方法后基本上是这样的:

Thread(target=root.ite(40000))
i、 e.在适当的位置运行该对象,并且由于
ite()
方法不返回任何内容,它将执行以下操作:

# freeze main loop
# after done, call Thread
Thread(target=None)
然后开始。因此,您冻结了主循环,在
ite()
结束后,
弹出窗口将显示。让我们用
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'
#:导入部分functools.partial
:
屏幕:
盒子布局:
按钮:
#按:root.popup()
#发布时:root.popup\u done()
按:root.thread\u it(部分(root.ite,400))
按:root.current='second'