Kivy中if语句未执行求助:轮椅篮球统计应用异常
问题分析与修复
核心问题1:按钮判断逻辑错误
你创建的所有按钮文本都是"+",但在update_stats里却判断button_text == "Fouls"——这显然永远不成立,因为按钮上显示的是"+",不是"Fouls"。你混淆了按钮对应的统计项名称和按钮本身的文本。
核心问题2:Team类的属性访问错误
Team类里定义的是私有变量_fouls,但你直接访问self.team_instance.fouls,这会触发AttributeError,因为类没有暴露名为fouls的公共属性。
修复后的代码示例
class Team: def __init__(self, team_name): self.team_name = team_name self._fouls = 0 self.players = [] # 添加属性访问器,允许安全读写fouls @property def fouls(self): return self._fouls @fouls.setter def fouls(self, value): self._fouls = value class Player: def __init__(self, name): self.name = name self.stats = { "Fouls": 0, "2-pt FG MADE": 0, "2-pt FG Missed": 0, "Rebounds": 0, "Assists": 0, } class HeaderRowWidget(GridLayout): def __init__(self, **kwargs): super(HeaderRowWidget, self).__init__(**kwargs) self.cols = 6 self.add_widget(Label(text="Player Name")) self.add_widget(Label(text="Shirt Number")) self.add_widget(Label(text="Fouls")) self.add_widget(Label(text="2-pt FG MADE")) self.add_widget(Label(text="2-pt FG Missed")) self.add_widget(Label(text="Rebounds")) class MyRowWidget(GridLayout): def __init__(self, player, team_instance, **kwargs): super(MyRowWidget, self).__init__(**kwargs) self.cols = 6 self.player = player self.name_label = Label(text=player.name) self.shirt_number_label = Label(text="default") self.add_widget(self.name_label) self.add_widget(self.shirt_number_label) self.team_instance = team_instance # Add buttons to the layout button_labels = ["Fouls", "2-pt FG MADE", "2-pt FG Missed", "Rebounds"] self.buttons = {} for label in button_labels: button = Button(text="+") self.buttons[label] = button # 绑定的时候把对应的统计项名称传进去,避免通过按钮文本判断 button.bind(on_press=lambda _, lbl=label: self.update_stats(lbl)) self.add_widget(button) def update_stats(self, stat_label): if stat_label == "Fouls": self.player.stats["Fouls"] += 1 print("players fouls increased") self.team_instance.fouls += 1 print("teams fouls increased") else: if stat_label in self.player.stats: self.player.stats[stat_label] += 1 print("stat updated")
关键修改点说明
- 给Team类添加了
@property和@fouls.setter,让fouls属性可以被安全访问和修改。 - 修改按钮绑定逻辑:使用lambda将统计项名称作为参数传递给
update_stats,直接通过统计项名称判断,不再依赖按钮文本。 - 简化else分支逻辑:直接通过传入的
stat_label更新对应统计项,无需遍历按钮字典。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

