Обновить кнопку KivyMD «на лету» (Python)

#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, но, похоже, для новичков вроде меня нет флажка. Извините.