Окно с фото не закрывается

Окно с фото не закрывается, тоесть после того как сервер вызывает функцию stop, должна произойти смена флага для self.stop_display и фото должно закрыться, а оно зависает, и продолжает быть открытым. В диспетчере задач пишет что окно не отвечает

class DisplayController:
    def __init__(self):
        self.screen_on = False
        self.stop_display = False
        self.photo_opened = False
        
    def get_file_type(self, file_name):
        ext = os.path.splitext(file_name)[1].lower()
        for category, extensions in FILE_TYPES.items():
            if  ext in extensions:
                return category
        return None
    
    def turn_on_screen(self):
        if not self.screen_on:
            turn_on_screen1()
            self.screen_on = True
            print("Экран включен")
            
    def turn_off_screen(self):
        # if self.screen_on:
        print('display_off_1111')
        turn_off_screen1()
        cv2.destroyAllWindows()
        self.screen_on = False
        self.stop_display = True
        print("Экран выключен")
    
    def stop(self):
        print('display_off')
        self.stop_display = True
        self.turn_off_screen()
                        
    def display_file(self, file_info):
        self.stop_display = False
        self.turn_on_screen()
        file_path = file_info.get('file_path')
        file_name = file_info.get('file_name')
        file_type = self.get_file_type(file_name)
        if file_type == 'image':
            self._open_photo(file_path)
        elif file_type == 'video':
            self._open_video(file_path)
        
    def _open_photo(self, file_path):
        try:
            response = requests.get(file_path)
            response.raise_for_status()
            image_array = np.asarray(bytearray(response.content), dtype=np.uint8)
            img = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
            
            cv2.namedWindow("Window", cv2.WINDOW_NORMAL)
            cv2.setWindowProperty("Window", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
            cv2.imshow("Window", img)
            """⚠️ Блокировка UI: cv2.waitKey(5000) в _open_photo() может "залипнуть", если окно неактивно. Лучше использовать таймер + cv2.pollKey() в цикле, если хочешь гибкости."""
            
            self.photo_opened = True
            
            while not self.stop_display:  # Проверка флага stop_display
                key = cv2.waitKey(100)  # Проверка клавиш с тайм-аутом 100ms
                if key == 27:  # Esc key для закрытия окна
                    self.stop_display = True
                    break
                time.sleep(0.1)
            
            # self.stop()
            if self.stop_display:
                print("Окно закрывается из-за флага stop_display.")
                cv2.destroyWindow("Window")
                
            """ оТПРАВИТЬ ИВЕНТ О ЗАКРЫТИИ ФАЙЛА"""
        except Exception as e:
            print("Ошибка при показе фото:", e)
        finally:
            self.photo_opened = False
        
    def _open_video(self, file_path):
        try:
            video = cv2.VideoCapture(file_path)
            cv2.namedWindow("Window", cv2.WINDOW_NORMAL)
            cv2.setWindowProperty("Window", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
            fps = video.get(cv2.CAP_PROP_FPS) or 25
            delay = int(1000 / fps)
            ret, frame = video.read()
            while ret and not self.stop_display:
                cv2.waitKey(delay)
                cv2.imshow("Window", frame)
                ret, frame = video.read()
            video.release()
        except Exception as e:
            print("Ошибка при показе фото:", e)

Ответы (0 шт):