Окно с фото не закрывается
Окно с фото не закрывается, тоесть после того как сервер вызывает функцию 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)