Обновление Kivy ProgressBar в режиме реального времени с внешнего входа - PullRequest
0 голосов
/ 18 марта 2020

У меня есть приложение, которое зависит от вывода системного приложения как такового, чтобы получить этот вывод, я использую модуль subprocess, который прекрасно работает, проблема в том, что это системное приложение генерирует выходные данные, поскольку оно работает как таковое. захватить вывод в режиме реального времени (здесь нет проблем), и я хочу использовать этот же вывод для обновления моего Kivy ProgressBar в режиме реального времени . Пока что я получаю вывод и пытаюсь обновить индикатор выполнения, но приложение просто зависает и обновляет индикатор выполнения, когда вызов subprocess завершен. Вот простой пример.

Предположим, что структура каталогов выглядит следующим образом:

project
|----------slow.py
|----------myapp.py

Предположим, slow.py - это файл, обрабатывающий системные вызовы, который получает выходные данные и передает их в функция, вот минимальный код для этого

from time import sleep

class Slow(object):
    def __init__(self):
        pass

    def call_me(self, callback):
        for x in range(10):
            sleep(2)
            callback(x)

Теперь для myapp.py кода:

from kivy.uix.progressbar import ProgressBar
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App

from slow import Slow

class MyWindow(BoxLayout):
    def __init__(self, **kw):
        super().__init__(**kw)
        self.padding = 100
        self.sl = Slow()
        self.pb = ProgressBar()
        self.pb.min=0
        self.pb.max=100

        btn = Button(text='Start Update')
        btn.bind(on_release=self.start_update)

        self.add_widget(self.pb)
        self.add_widget(btn)

    def start_update(self, *args):
        self.sl.call_me(self.update_progress)

    def update_progress(self, progress):
        print(progress)
        self.pb.value = float(progress)

class MyApp(App):
    def build(self):
        return MyWindow()


MyApp().run()

Если вы запустите это приложение, вы заметите, что оно зависает до подсчет сделан. Как я могу исправить такой сценарий?

NB : я уже пытался использовать Clock.schedule_once, который, разумеется, дает тот же результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...