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

Python Kivy开发足球游戏点击更新分数报Ball无root属性错误如何解决

问题原因与修复方案

报错核心原因

  1. 方法缩进错误:你代码里HomeScreen、GameScreen、Ball、MainApp的所有自定义方法都没有正确缩进归入类内部,全部定义成了全局函数,导致类的实例根本调用不到对应逻辑
  2. Ball类无root属性:root是Kivy App类的专属属性,作为Widget子类的Ball本身没有这个属性,你需要先获取当前运行的App实例才能访问根组件
  3. id调用错误:你写的ids.label.score.text完全多余,GameScreen里的分数标签id直接是score,不需要额外加label层级

修正后的完整main.py代码

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.image import Image
from kivy.core.audio import SoundLoader
from kivy.clock import Clock
from kivy.properties import NumericProperty
from kivy.vector import Vector


class HomeScreen(Screen):
    # 方法缩进归入类内部
    def play_sound(self):
        # 注意你原来的文件名末尾多了个点,已经去掉
        sound = SoundLoader.load('button press sound.wav')
        if sound:
            sound.play()


sound = SoundLoader.load('Crowd sound effect.wav')
sound.loop = True
sound.play()


class GameScreen(Screen):
    # 方法缩进归入类内部
    def play_sound(self):
        sound = SoundLoader.load('button press sound.wav')
        if sound:
            sound.play()


class Ball(Image):
    velocity = NumericProperty(0)

    # 方法缩进归入类内部
    def on_touch_down(self, touch):
        if Vector(self.center).distance(touch.pos) <= 33:
            # 获取当前运行的App实例访问root,同时修正id调用路径
            app = App.get_running_app()
            app.root.ids.game_screen.ids.score.text = str(int(app.root.ids.game_screen.ids.score.text)+1)
            sound = SoundLoader.load('Soccer ball sound.wav')
            if sound:
                sound.play()
            self.source = "icons/ball.png"
            self.velocity = 275
        return super().on_touch_down(touch)

    # 方法缩进归入类内部
    def on_touch_up(self, touch):
        if Vector(self.center).distance(touch.pos) <= 33:
            self.source = "icons/ball.png"
        return super().on_touch_up(touch)


class MainApp(App):
    GRAVITY = 300

    # 方法缩进归入类内部
    def move_ball(self, time_passed):
        ball = self.root.ids.game_screen.ids.ball
        ball.y = ball.y + ball.velocity * time_passed
        ball.velocity = ball.velocity - self.GRAVITY * time_passed

    # 方法缩进归入类内部
    def start_game(self):
        Clock.schedule_interval(self.move_ball, 1/60.)
        self.root.ids.game_screen.ids.score.text = "0"

    # 方法缩进归入类内部
    def change_screen(self, screen_name):
        self.root.current = screen_name


if __name__ == "__main__":
    MainApp().run()

其他注意点

你原来的声音加载路径里'button press sound.wav.'末尾多了一个点,会导致加载失败,修正代码里已经去掉,你可以确认下本地的声音文件名是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:45:05