
kivy 中 scrollview 子控件空白,通常因误创建新 app 实例导致操作未作用于当前运行界面;正确做法是通过 `app.get_running_app()` 获取唯一运行界面实例来更新 ui。
在 Kivy 应用中,ScrollView 本身不会主动隐藏子控件,但若其子控件(如 GridLayout、Label 等)未被正确添加到当前正在运行的 App 实例的 UI 树中,就会表现为“内容不显示”——即使日志打印正常、逻辑看似无误。本例的核心问题出在 SelectableLabel.apply_selection() 方法中:
def apply_selection(self, rv, index, is_selected):
self.selected = is_selected
if is_selected:
MyApp().display_info(self.data) # ❌ 错误:新建了一个无关的 MyApp 实例该行代码每次触发选择时都会构造一个全新的 MyApp() 对象,调用其 display_info(),但这个新实例完全独立于当前正在渲染的窗口,其内部的 self.info_layout 是一个未挂载到屏幕的孤立布局,因此无论添加多少 Label 或 Button,都不可见。
✅ 正确解法是获取当前正在运行的 App 实例:
from kivy.app import App
# 替换为:
def apply_selection(self, rv, index, is_selected):
self.selected = is_selected
if is_selected:
App.get_running_app().display_info(self.data) # ✅ 正确:访问真实运行实例App.get_running_app() 是 Kivy 提供的全局接口,返回当前 App.run() 启动并处于活动状态的唯一应用对象,确保所有 UI 更新作用于真实视图树。
⚠️ 补充注意事项:
- ScrollView 要求其直接子控件具备明确高度(size_hint_y = None + height),否则可能因高度为 0 导致不可见。本例中 self.info_layout 已设置 size_hint=(1, None) 和 height=500,符合要求;
- 若后续动态添加大量内容,建议将 self.info_layout.height 动态设为 self.info_layout.minimum_height,以适配内容变化;
- display_info() 中调用 clear_widgets() + add_widget() 是安全的,但需确保 self.info_layout 始终是 ScrollView 的唯一子控件(本例已满足)。
修复后,点击左侧词条即可实时在右侧 ScrollView 中显示对应释义,UI 响应完整可靠。










