ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Python Kivy:正确启动更新GUI元素的后台进程

2019-06-09 20:45:11  阅读:429  来源: 互联网

标签:python event-handling kivy


我有一个Python脚本执行一些密集的用户文件处理,可能需要一些时间.我使用Kivy为它构建了一个用户界面,允许用户选择文件,处理模式并在进程继续时向他们显示一些消息.

我的问题是当主Kivy循环传递调用底层用户界面时,窗口冻结.

根据我的理解,解决这个问题的正确方法是创建一个单独的进程,脚本将被卸载并从中将更新发送到用户界面.

但是,我无法找到如何执行此操作的示例或有关如何将消息从单独的线程发送回应用程序的任何规范.

有人可以举例说明如何正确地做到这一点或指向我有关该主题的文件?

更新:

为了保持程序的可维护性,我想避免从主线程中调用处理器循环的元素,而是调用一个返回GUI更新元素的长进程,例如进度条或文本字段.看起来这些元素只能从主要的kivy线程中修改.如何从外部访问它们?

解决方法:

使用here所述的发布者/消费者模型.以下是修改为使用单独线程的链接的示例:

from kivy.app import App
from kivy.clock import Clock, _default_time as time  # ok, no better way to use the same clock as kivy, hmm
from kivy.lang import Builder
from kivy.factory import Factory
from kivy.uix.button import Button
from kivy.properties import ListProperty

from threading import Thread
from time import sleep

MAX_TIME = 1/60.

kv = '''
BoxLayout:
    ScrollView:
        GridLayout:
            cols: 1
            id: target
            size_hint: 1, None
            height: self.minimum_height

    MyButton:
        text: 'run'

<MyLabel@Label>:
    size_hint_y: None
    height: self.texture_size[1]
'''

class MyButton(Button):
    def on_press(self, *args):
        Thread(target=self.worker).start()

    def worker(self):
        sleep(5) # blocking operation
        App.get_running_app().consommables.append("done")

class PubConApp(App):
    consommables = ListProperty([])

    def build(self):
        Clock.schedule_interval(self.consume, 0)
        return Builder.load_string(kv)

    def consume(self, *args):
        while self.consommables and time() < (Clock.get_time() + MAX_TIME):
            item = self.consommables.pop(0)  # i want the first one
            label = Factory.MyLabel(text=item)
            self.root.ids.target.add_widget(label)

if __name__ == '__main__':
    PubConApp().run()

标签:python,event-handling,kivy
来源: https://codeday.me/bug/20190609/1207171.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有