#python #kivy #kivymd
#python #kivy #kivymd
Вопрос:
У меня есть кнопка KivyMD, которая включает (инициализирует) YOLO. При инициализации YOLO кнопка становится зеленой. Это работает, но инициализация YOLO занимает около 8 секунд. Итак, я хотел бы сделать кнопку желтой во время инициализации и зеленой по завершении. Проблема в том, что янтарный цвет никогда не отображается, потому что подпрограмма блокируется. Есть идеи, как я могу перерисовать кнопку, чтобы она отображалась в желтом цвете, пока не вернется вызов yolo_init ()? Спасибо!
def btn_yolo(self):
if self.root.ids['_btn_yolo'].text_color == green: #we want to turn-off YOLO
self.yolo.close_session()
self.root.ids['_btn_yolo'].text_color = black #this shows
else: #we want to initialize YOLO
self.root.ids['_btn_yolo'].text_color = amber #this never shows
#update/refresh the button how?
self.yolo = init_yolo(FLAGS) #this takes long
self.root.ids['_btn_yolo'].text_color = green #this shows
Ответ №1:
Вы можете сделать это init_yolo()
в другом потоке, чтобы она не блокировала изменение цвета на желтый. Затем этот поток может вызвать Clock.schedule_once()
, чтобы установить цвет на зеленый. Это предполагает, что init_yolo()
не вносит никаких изменений в графический интерфейс пользователя (что должно быть сделано в основном потоке). Этот код не был протестирован, поэтому могут быть некоторые ошибки, но он должен дать вам общее представление о том, как это сделать.
def btn_yolo(self):
if self.root.ids['_btn_yolo'].text_color == green: #we want to turn-off YOLO
self.yolo.close_session()
self.root.ids['_btn_yolo'].text_color = black #this shows
else: #we want to initialize YOLO
self.root.ids['_btn_yolo'].text_color = amber #this never shows
#update/refresh the button how?
threading.Thread(target=self.do_init, args=(FLAGS)).start()
def do_init(self, FLAGS):
self.yolo = init_yolo(FLAGS) #this takes long
Clock.schedule_once(self.update_text_color)
def update_text_color(self, dt):
self.root.ids['_btn_yolo'].text_color = green #this shows
Комментарии:
1. Да, что-то подобное сработало бы, спасибо. Я надеялся на что-то более простое, но не могу использовать все. init_yolo вообще не влияет на графический интерфейс, он просто инициализирует объект YOLO для последующего использования. Присвоено три звезды, но они не отображаются, я здесь новичок
2. Искал способ сделать это, @John Anderson, но, похоже, для новичков вроде меня нет флажка. Извините.