2025, Dec 04 18:01

Как заставить VideoPlayer в Kivy заполнять BoxLayout: fit_mode в options

Почему VideoPlayer в Kivy не растягивается в BoxLayout и как задать fit_mode через options. Выберите fill или contain, чтобы видео заполняло контейнер.

Когда вы внедряете VideoPlayer в макет Kivy, естественно ожидать, что видео будет растягиваться под доступное пространство при изменении размера окна. Но иногда оно упирается в предел и не заполняет BoxLayout, оставляя заметные зазоры вокруг текстуры. Обычно дело в том, как параметры, отвечающие за растяжение, передаются базовому видеовиджету.

Как воспроизвести проблему

Пример ниже показывает экран с VideoPlayer, который не расширяется так, чтобы занять весь контейнер. На первый взгляд всё верно, но после какого-то момента видеотекстура перестаёт расти.

Screen:
    name: "ClipPanel"
    id: pane_clip
    BoxLayout:
        orientation: 'vertical'
        VideoPlayer:
            id: vp_node
            allow_stretch: True
            size_hint: (1, .9)
            source: ''
            allow_fullscreen: True
            options: {'eos': 'stop'}
            keep_ratio: False
            player_state: 'play'

        Button:
            size_hint: (1,.1)
            text: "Close"
            on_press:
                vp_node.state = "stop"
                vp_node.source = ""
            on_release: root.open_main()

Что происходит на самом деле

Поведение растяжения определяется настройкой видеотекстуры, а не только размерами контейнера. Ключевой момент: параметры, связанные с растяжением/вписыванием, нужно передавать через словарь options, потому что это опции внутреннего экземпляра Video, который использует VideoPlayer. Просто установить свойства вроде allow_stretch или полагаться на изменение размеров контейнера недостаточно, чтобы управлять тем, как текстура вписывается в виджет.

На практике это означает, что режим вписывания следует передавать через options, чтобы видеотекстура «понимала», нужно ли заполнять всё пространство или сохранять пропорции в пределах виджета.

Решение: задайте fit_mode через options

Чтобы видео занимало выделенную область, добавьте fit_mode в options. Используйте fill, чтобы занять всё доступное пространство, или contain, если важно сохранить соотношение сторон внутри виджета.

Screen:
    name: "ClipPanel"
    id: pane_clip
    BoxLayout:
        orientation: 'vertical'
        VideoPlayer:
            id: vp_node
            allow_stretch: True
            size_hint: (1, .9)
            source: ''
            allow_fullscreen: True
            options: {'eos': 'stop', 'fit_mode': 'fill'}
            keep_ratio: False
            player_state: 'play'

        Button:
            size_hint: (1,.1)
            text: "Close"
            on_press:
                vp_node.state = "stop"
                vp_node.source = ""
            on_release: root.open_main()

Если не хотите искажений при масштабировании, замените fill на contain.

Почему это важно

Без корректной настройки вписывания, переданной через options, видеотекстура не будет «следовать» геометрии виджета при изменении размеров окна. В итоге часть экрана простаивает, а в макете появляются неловкие зазоры. Это особенно заметно в интерфейсах, где видео играет ключевую роль. Такая чувствительность к компоновке проявляется и с локальными файлами, и с сетевыми потоками.

Выводы

Всегда настраивайте поведение растяжения и вписывания через словарь options у VideoPlayer, чтобы внутренний экземпляр Video получил нужные указания. Выбирайте fit_mode: 'fill', если цель — занять всё доступное пространство, и переключайтесь на 'contain', когда важнее сохранить соотношение сторон. При диагностике проблем с компоновкой проверьте минимальный, запускаемый KV-пример с известным источником — так легко убедиться, что текстура реагирует на fit_mode как задумано.

С правильными опциями VideoPlayer масштабируется предсказуемо и заполняет контейнер в соответствии с логикой макета.