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
相关产品推荐
相关产品推荐

