Как заменить фона окна на видео?

У меня есть программа - мини-игра "орёл или решка". Всё работает, только осталось сделать замену фона окна на видео (строки 36, 39, 42, 45), не получается этого сделать.
Можно использовать любые библиотеки, главное чтобы работало.

import pygame
import random

# Инициализация Pygame
pygame.init()

# Размеры окна
win_width = 1920
win_height = 1080

# Создание окна
win = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption("Heads or Tails")

# Загрузка изображений и шрифта
bg = pygame.image.load("eagle.png")
exit_button = pygame.image.load("coin_exit_button.png")
font = pygame.font.Font("cf.ttf", 60)

# Координаты кнопки выхода
exit_button_x = 50
exit_button_y = 50

# Счетчики выпавших орлов и решек
e_counter = 0
n_counter = 0

# Значения res и last_res
res = "none"
last_res = "e"


# Функция для изменения фона окна и возвращения нового значения last_res
def throw(res, last_res):
    if last_res == "e" and res == "e":
        # Заменить фон на видео "etel.mp4"
        pass
    elif last_res == "e" and res == "n":
        # Заменить фон на видео "etnl.mp4"
        pass
    elif last_res == "n" and res == "n":
        # Заменить фон на видео "ntnl.mp4"
        pass
    elif last_res == "n" and res == "e":
        # Заменить фон на видео "ntel.mp4"
        pass

        # Воспроизвести видео

    return res


# Основной цикл программы
running = True
clock = pygame.time.Clock()

while running:
    clock.tick(60)  # Ограничение частоты обновления экрана (60 кадров в секунду)

    # Обработка событий
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            # Получение координат клика мыши
            mouse_x, mouse_y = pygame.mouse.get_pos()

            # Проверка, был ли клик на кнопке выхода
            if exit_button_x <= mouse_x <= exit_button_x + exit_button.get_width() and \
                    exit_button_y <= mouse_y <= exit_button_y + exit_button.get_height():
                running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w or event.key == pygame.K_SPACE or \
                    event.key == pygame.K_UP or event.key == pygame.K_RETURN:
                # Выбор случайного значения для res - "e" или "n"
                res = random.choice(["e", "n"])

                # Изменение счетчиков орлов и решек
                if res == "e":
                    e_counter += 1
                elif res == "n":
                    n_counter += 1

                    # Вызов функции throw
                last_res = throw(res, last_res)

                # Отрисовка фона и кнопки выхода
    win.blit(bg, (0, 0))
    win.blit(exit_button, (exit_button_x, exit_button_y))

    # Отрисовка текста счетчика орлов и решек
    e_counter_text = font.render(f"Орёл: {e_counter}", True, (255, 255, 255))
    n_counter_text = font.render(f"Решка: {n_counter}", True, (255, 255, 255))

    win.blit(e_counter_text, (1500, 15))
    win.blit(n_counter_text, (1500, 100))

    pygame.display.flip()  # Обновление экрана

# Завершение программы
pygame.quit()


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

Автор решения: S. Nick

Как вариант, примерно так:

import cv2                                                           # +++
import pygame
import random

# Инициализация Pygame
pygame.init()

# Размеры окна      # установите свое
win_width = 600     # 
win_height = 600    # 

# Создание окна
win = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption("Heads or Tails")

# Загрузка изображений и шрифта
bg = pygame.image.load("im.png")                                 # установите свое
exit_button = pygame.image.load("Ok.png")                        # установите свое
font = pygame.font.Font(None, 60)                                # установите свое

# Координаты кнопки выхода
exit_button_x = 50
exit_button_y = 50

# Счетчики выпавших орлов и решек
e_counter = 0
n_counter = 0

# Значения res и last_res
res = "none"
last_res = "e"
video = None                                                         # +++

# Ф-я для изм-я фона окна и возвр-я нового значения last_res
def throw(res, last_res):
    if last_res == "e" and res == "e":
        # Заменить фон на видео "etel.mp4"
        video = cv2.VideoCapture("2021-05-11 16-12-08.mp4")     # установите свое
    elif last_res == "e" and res == "n":
        # Заменить фон на видео "etnl.mp4"
        video = cv2.VideoCapture("video6.avi")                  # установите свое
    elif last_res == "n" and res == "n":
        # Заменить фон на видео "ntnl.mp4"
        video = cv2.VideoCapture("video6.avi")                  # установите свое
    elif last_res == "n" and res == "e":
        # Заменить фон на видео "ntel.mp4"
        video = cv2.VideoCapture("Samonastrojka.avi")           # установите свое 
    else:                   #  на всякий случай 
        print('# ??? ' * 7)   
        video = None        

    return res, video                                           # !!! +++ video


# Основной цикл программы
running = True
clock = pygame.time.Clock()

while running:
    clock.tick(60)  

    # Обработка событий
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            # Получение координат клика мыши
            mouse_x, mouse_y = pygame.mouse.get_pos()

            # Проверка, был ли клик на кнопке выхода
            if exit_button_x <= mouse_x <= exit_button_x + exit_button.get_width() and \
                    exit_button_y <= mouse_y <= exit_button_y + exit_button.get_height():
                running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w or event.key == pygame.K_SPACE or \
                    event.key == pygame.K_UP or event.key == pygame.K_RETURN:
                # Выбор случайного значения для res - "e" или "n"
                res = random.choice(["e", "n"])

                # Изменение счетчиков орлов и решек
                if res == "e":
                    e_counter += 1
                elif res == "n":
                    n_counter += 1

                # Вызов функции throw
                last_res, video = throw(res, last_res)           # !!! +++ video
                print(f'{type(video)}') #

# !!! +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Воспроизвести видео  
                if video:
                    success, video_image = video.read()
                    fps = video.get(cv2.CAP_PROP_FPS)
                    window = pygame.display.set_mode(video_image.shape[1::-1])                
                    run = success
                    while run:
                        clock.tick(fps)
                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                run = False
                            elif event.type == pygame.KEYDOWN:
                                if event.key == pygame.K_ESCAPE:        # +++
                                    run = False                                
                        success, video_image = video.read()
                        if success:
                            video_surf = pygame.image.frombuffer(
                                video_image.tobytes(), 
                                video_image.shape[1::-1], 
                                "BGR"
                            )
                        else:
                            run = False
                            
                        window.blit(video_surf, (0, 0))
                        pygame.display.flip()                
# !!! +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Воспроизвести видео                     

    # Отрисовка фона и кнопки выхода
    win.blit(bg, (0, 0))
    win.blit(exit_button, (exit_button_x, exit_button_y))

    # Отрисовка текста счетчика орлов и решек;  установите свое vvvvvvvvvvv  # !!!
    e_counter_text = font.render(f"Orel    {e_counter}", True, (255, 55, 55))
    n_counter_text = font.render(f"Reshka  {n_counter}", True, (155, 255, 55))

    win.blit(e_counter_text, (400, 15))                      # установите свое
    win.blit(n_counter_text, (400, 100))                     # установите свое

    pygame.display.flip()  # Обновление экрана

# Завершение программы
pygame.quit()

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка