Python Kivy开发足球游戏点击更新分数报Ball无root属性错误如何解决
问题原因与修复方案
报错核心原因
- 方法缩进错误:你代码里
HomeScreen、GameScreen、Ball、MainApp的所有自定义方法都没有正确缩进归入类内部,全部定义成了全局函数,导致类的实例根本调用不到对应逻辑 Ball类无root属性:root是Kivy App类的专属属性,作为Widget子类的Ball本身没有这个属性,你需要先获取当前运行的App实例才能访问根组件- 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
相关产品推荐
相关产品推荐

