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

标签 python kivy

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

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有Clock您可能也会感兴趣。

对于这个确切的代码,您需要 partial ,这将及时卡住一个函数并返回一个可以作为参数传递的东西,这样它就不会在您想要将其作为参数添加到线程函数的地方执行(例如 if 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/

相关文章:

python - Keras 的 TensorFlow 后端是否依赖 eager execution?

android - 在 Playstore 中发布现成的 Kivy 应用程序之前的流程?

android - 更新 Google Play 上的 apk 文件

macos - pkg-config:PKG_PROG_PKG_CONFIG:找不到命令

python - 如何根据条件选择列?

Python 将单个字典项移动(弹出)到新字典中

python - 使用 pd.read_csv 打开 CSV 文件 - 上下文管理器的任何目的?

python - 如何确定跨键盘的最佳路线

python - Kivy ListView excel 文件

android - Kivy (Python) 格式化问题