You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy VideoPlayer退出全屏后无法恢复原始尺寸问题求助

问题原因
  • Kivy内置VideoPlayer的默认全屏逻辑存在缺陷:进入全屏时会将VideoPlayer实例从原父布局(你代码中的FloatLayout)中移除,直接挂载到根窗口上,同时会清除原有size_hint、pos_hint属性,改为匹配全屏尺寸。
  • 退出全屏时,默认逻辑仅将VideoPlayer加回原父布局,并不会还原之前定义的布局属性,导致视频组件尺寸异常,同时布局渲染层级错乱,引发其他组件显示异常。
  • 补充:你提供的kv代码还存在缩进错误,on_selection: root.select(chooser.selection)被写在了canvas.before块内,会导致文件选择后回调无法触发。
修复方案

步骤1:修改Python代码,添加全屏状态监听

在VideosWindow类中新增属性记录原始布局参数,绑定全屏状态变化事件,退出全屏时手动恢复属性并触发布局重绘:

import os
from kivy.properties import BooleanProperty
# 替换my_folder为你自己定义的路径变量
class VideosWindow(Screen):
    # 存储VideoPlayer原始布局参数
    original_size_hint = None
    original_pos_hint = None

    def on_enter(self, *args):
        # 进入页面时绑定全屏状态监听
        self.ids.vid.bind(fullscreen=self.on_fullscreen_change)
        # 保存初始布局配置
        self.original_size_hint = self.ids.vid.size_hint
        self.original_pos_hint = self.ids.vid.pos_hint

    def on_fullscreen_change(self, instance, is_fullscreen):
        # 退出全屏时恢复配置
        if not is_fullscreen:
            instance.size_hint = self.original_size_hint
            instance.pos_hint = self.original_pos_hint
            # 强制父布局重绘,修正其他组件显示异常
            self.ids.float_layout.do_layout()

    def get_files_list(self):
        files = os.sep.join([my_folder,'mp4'])
        return files

    def select(self, filename):
        if filename:
            self.ids.vid.source = filename[0]
            self.ids.vid.state = 'play'

步骤2:修改kv代码,修正缩进并添加父布局id

给FloatLayout添加id方便调用重绘方法,同时修正on_selection的缩进错误:

<VideosWindow>:
    name: 'vids'
    FloatLayout:
        id: float_layout # 新增父布局id
        FileChooserListView:
            id:chooser
            path: root.get_files_list() 
            canvas.before:
                Color:
                    rgb: .4, .5, .5
                Rectangle:
                    pos: self.pos
                    size: self.size
            on_selection: root.select(chooser.selection) # 修正缩进,移出canvas.before块
            size_hint: (.9, .15)
            pos_hint: {'x':.05, 'y':.8} 
        VideoPlayer:
            id:vid
            options: {'eos':'loop'}
            size_hint: (.9, .7)
            pos_hint: {'x':.05, 'y':.05} 
        Button:
            size_hint_y: 0.3
            height: 48
            text: "open"
            disabled: not chooser.selection  
            on_release: root.select(chooser.selection)
            size_hint: (.45, .05)
            pos_hint: {'x':.05, 'y':.00}
        Button:
            text: 'Go Back'
            color: (1,1,1,1)
            background_normal:''
            background_color: (0.3,0.6,0.7,1)
            on_release: 
                vid.state = 'pause'
                app.root.current = 'saved_files'
            size_hint: (.45, .05)
            pos_hint: {'x':.50, 'y':.00}

可选方案:禁用默认双击全屏

如果不需要默认的双击全屏功能,可以直接在VideoPlayer配置中添加allow_fullscreen: False,后续自行实现自定义全屏逻辑即可,也能避免该问题。

内容的提问来源于stack exchange,提问作者pear1_jam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:24:04