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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:38:12