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

Kivy新手求助:获取整数用户输入作为循环参数时报错解决

解决你的Kivy训练组数转换问题

首先,咱们来拆解你遇到的TypeError:你看到的错误核心是ActiveExerciseSet始终是None,根本没有被正确赋值成用户输入的数字。问题出在这两个关键地方:

1. 全局变量没有被正确修改

你在AddExercise方法里直接给ActiveExerciseSet赋值时,Python会把它当作局部变量,而不是你一开始定义的全局变量。这就导致全局的ActiveExerciseSet还是初始的None,转int的时候自然就报错了。

修复这个问题很简单,在AddExercise里先声明要使用全局变量:

ActiveExerciseSet = None
class AddWorkoutWidget(Screen):
    exercise_set = ObjectProperty("0")
    def AddExercise(self):
        global ActiveExerciseSet  # 声明使用全局变量,确保修改的是全局的那个值
        ActiveExerciseSet = self.exercise_set.text

2. 处理空输入或未赋值的情况

就算修复了全局变量,还要考虑用户可能没输入就点击按钮的情况(比如输入框是空的),这时候转int也会报错。所以在AddSetWidget里要做个兜底处理:

class AddSetWidget(GridLayout, Screen):
    def __init__(self, **kwargs):
        super(AddSetWidget, self).__init__(**kwargs)
        # 先处理训练组数,避免None或空字符串的情况
        set_count = 1  # 给个默认值,比如默认1组
        if ActiveExerciseSet and ActiveExerciseSet.isdigit():
            set_count = int(ActiveExerciseSet)
        self.cols = set_count
        # 循环创建每组的重复次数输入控件
        for i in range(set_count):
            self.add_widget(Label(text=f"Set {i+1} Reps:"))
            self.add_widget(TextInput(input_filter='int', multiline=False))

3. 更优雅的替代方案:避免全局变量

全局变量其实不是Kivy推荐的做法,你可以把训练组数存在App类的属性里,这样更符合Kivy的架构,也避免了全局变量的潜在问题:

首先修改你的App类:

from kivy.app import App
from kivy.properties import StringProperty

class MyFitnessApp(App):
    active_exercise_set = StringProperty("0")  # 用Kivy的响应式属性存储
    def build(self):
        # 这里返回你的ScreenManager实例
        pass

然后修改AddExercise方法:

def AddExercise(self):
    app = App.get_running_app()
    app.active_exercise_set = self.exercise_set.text

最后在AddSetWidget里获取这个值:

from kivy.app import App
class AddSetWidget(GridLayout, Screen):
    def __init__(self, **kwargs):
        super(AddSetWidget, self).__init__(**kwargs)
        app = App.get_running_app()
        set_count = int(app.active_exercise_set) if app.active_exercise_set.isdigit() else 1
        self.cols = set_count
        # 后续循环逻辑和之前一致

补充:屏幕切换的小细节

别忘了在Kivy代码里,点击按钮后要切换到AddSetWidget对应的屏幕,比如:

<AddWorkoutWidget>
    exercise_set : exercise_set
    Label:
        text: "Number of sets "
    TextInput:
        id: exercise_set
        input_filter: 'int'
        multiline: False
    Button:
        text: 'Number of reps'
        on_press:
            root.AddExercise()
            app.root.current = 'add_set_screen'  # 切换到训练组输入屏幕

这样就能顺利把用户输入的训练组数转成整数,用来循环创建重复次数的输入控件啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:28:15