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
相关产品推荐
相关产品推荐

