对于我的应用程序中的某些过程,我使用互联网来获取一些数据。因此,对于那些经过处理的人,我希望在过程开始时出现一个简单的弹出框(带有正在加载的文本...),但是当我运行测试代码时,我发现弹出框显示在过程结束时而不是一开始就没有用。这是我正在使用的测试代码。感谢您的帮助。

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主循环竞争并且不在Thread中运行的事物都会冻结主循环。 Kivy的Clock也可能使您感兴趣。

但是,对于此确切的代码,您将需要partial,它将及时冻结函数并返回可以作为参数传递的内容,这样就不会在要添加其作为参数的位置执行它。到线程函数(例如,如果ite()意味着要执行,则partial将删除那些括号,并在必要时让Thread添加它们)

Thread(target=fx)基本上是指通过ite()方法后的方法:

Thread(target=root.ite(40000))


也就是说,就地运行该东西,并且由于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'

关于python - 在运行过程结束时显示的kivy弹出窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40452999/

10-09 07:00
查看更多