0

我有一个 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
4

1 回答 1

1

您可以init_yolo()在另一个线程中执行您的操作,这样它就不会阻止颜色变为琥珀色。然后该线程可以调用Clock.schedule_once()将颜色设置为绿色。这假定init_yolo()不会对 GUI 进行任何更改(必须在主线程上完成)。此代码尚未经过测试,因此可能存在一些错误,但它应该让您大致了解如何执行此操作。

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
    
        
于 2020-08-22T17:28:56.830 回答