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

Kivy应用点击Main Menu按钮后黑屏/无响应问题排查求助

Kivy应用点击“Main Menu”按钮后黑屏无菜单显示

问题描述

点击界面中的“Main Menu”按钮后,界面出现黑屏,菜单无法展开,且无任何错误提示。

问题根源

你的KV代码中,MainMenuBL:是作为根节点实例定义的,而非类规则(正确的类规则需要用<MainMenuBL>:包裹)。这导致只有App初始化时加载的第一个MainMenuBL实例会包含按钮布局,后续通过MainMenuBL()创建的新实例不会应用任何KV布局,空的BoxLayout就会显示为黑屏。

修复方案

  1. 将KV中的MainMenuBL:改为<MainMenuBL>:,定义类规则让所有MainMenuBL实例都能应用布局
  2. 在App的build方法中手动添加初始的MainMenuBL实例,因为KV不再包含根节点

修改后的完整代码

KV部分

<MyBL>:
    name: "my_bl"
    orientation: "vertical"
    size_hint: (0.95, 0.95)
    pos_hint: {"center_x": 0.5, "center_y": 0.5}
    Label:
        font_size: "30sp"
        text: root.data_label
    Button:
        text: "1 przedzial"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: root.add_up(1, 50, 100)
    Button:
        text: "2 przedzial"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: root.add_up(2, 100, 200)
    Button:
        text: "3 przedzial"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: root.add_up(3, 200, 400)
    Button:
        text: "4 przedzial"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: root.add_up(4, 400, 800)
    Button:
        text: "5 przedzial"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: root.add_up(5, 800, 1600)
    Button:
        text: "Stop"
        bold: True
        background_color: '#FF0000'
        size_hint: (1, 0.5)
        on_press: root.stop()
    Button:
        text: "Main Menu"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: app.go_to_main_menu()

<MainMenuBL>:
    name: "main_menu"
    orientation: "vertical"
    size_hint: (0.95, 0.95)
    pos_hint: {"center_x": 0.5, "center_y": 0.5}
    Button:
        text: "Start"
        bold: True
        background_color: '#00FFCE'
        size_hint: (1, 0.5)
        on_press: app.go_to_my_bl()

Python部分

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
import random

KV = """
# 粘贴上面的KV代码内容
"""

class MyBL(BoxLayout):
    data_label = StringProperty("Type number!")
    total_sum = 0

    def add_up(self, index, start, end):
        random_num = random.randint(start, end)
        self.total_sum += random_num
        self.data_label = f"Button {index}: {random_num}\n"

    def stop(self):
        self.data_label = f"Final Total Sum: {self.total_sum}"
        self.total_sum = 0

class MainMenuBL(BoxLayout):
    pass

class MyApp(App):
    def build(self):
        self.root = BoxLayout()  # 创建空的根布局
        Builder.load_string(KV)
        self.current_screen = "main_menu"
        self.root.add_widget(MainMenuBL())  # 添加初始主菜单
        return self.root

    def go_to_my_bl(self):
        if self.current_screen != "my_bl":
            self.root.clear_widgets()
            self.root.add_widget(MyBL())
            self.current_screen = "my_bl"

    def go_to_main_menu(self):
        if self.current_screen != "main_menu":
            self.root.clear_widgets()
            main_menu = MainMenuBL()
            self.root.add_widget(main_menu)
            self.current_screen = "main_menu"

MyApp().run()

额外建议

Kivy自带ScreenManager组件专门用于多界面切换,比手动添加/移除Widget更规范,不易出错。如果后续界面复杂度提升,建议改用ScreenManager实现页面切换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:25:37