У меня есть приложение, которое зависит от вывода системного приложения как такового, чтобы получить этот вывод, я использую модуль 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
, который, разумеется, дает тот же результат