【问题标题】:kivy popup displaying at the end of a running process在运行进程结束时显示 kivy 弹出窗口
【发布时间】:2016-11-06 18:32:46
【问题描述】:

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

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'

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    问题在于您的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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2020-10-12
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多