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

Python Kivy 屏幕显示时隐藏进度条on_pre_enter不生效问题

代码失效原因

on_pre_enter 事件从未被触发,问题根源:

  • on_pre_enter 是 Screen 类专属的生命周期回调,仅当控件继承自Screen、且被ScreenManager管理时,才会在页面即将显示时自动调用。
  • 你的MyLayout直接继承自基础Widget类,也没有接入ScreenManager,所以你定义的on_pre_enter只是一个普通自定义方法,Kivy框架不会主动执行它,隐藏逻辑自然不会生效。
基础修复方案

把触发隐藏逻辑的回调替换为所有Widget都支持的on_kv_post即可,这个回调会在KV规则完全加载、ids字典初始化完成后自动触发,完全满足「屏幕显示第一时间执行」的要求:

class MyLayout(Widget):
    def on_kv_post(self, base_widget):
        hide_widget(self.ids.pgb_excel_read, True)

修改后启动App,进度条会在界面首次渲染时就处于隐藏状态。

更简洁的隐藏实现

如果只需要进度条默认隐藏,完全不需要写Python侧的调用逻辑,直接在KV中给ProgressBar配置初始属性即可,不需要额外定义函数、绑定事件:

ProgressBar:
    id:         pgb_excel_read
    min:        0
    max:        100
    value:      0
    size_hint:  (1, 0.1)
    # 新增以下4行实现初始隐藏
    opacity: 0
    disabled: True
    size_hint_y: None
    height: 0

注意:如果只设置opacity:0,控件只是视觉上不可见,依然会占用布局位置、响应交互事件,必须搭配禁用、高度置零才能实现完全隐藏的效果。

如果需要频繁切换控件的显示/隐藏状态,你原本写的hide_widget工具函数已经是最优实现:通过保存原有属性、同时修改透明度、交互状态、布局尺寸的方式隐藏控件,比直接删除控件、或者仅改透明度的方案性能更好,也不会丢失控件原有状态,后续需要显示时调用hide_widget(控件, False)即可一键恢复所有属性,不需要额外调整。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:51:37