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 масштабируется предсказуемо и заполняет контейнер в соответствии с логикой макета.