Kivy文本输入转换错误:开发战锤骰子掷骰器时int与str比较报错
战锤骰子掷骰器代码修复方案
你遇到的TypeError: '>=' not supported between instances of 'int' and 'str'报错核心原因是Kivy的TextInput组件返回的文本内容默认为字符串类型,无法直接和整数类型的骰子点数做大小比较。同时你的代码还存在其他逻辑错误,以下是完整修复方案:
需修改的核心问题
- 缺失
random库导入,无法调用random.randint生成随机点数 - 未将输入框拿到的
rolls(掷骰次数)、hits(命中阈值)转为整数类型 - 循环逻辑错误:
for i in (rolls)是遍历字符串的单个字符,没有按指定次数掷骰子 - 计数语法错误:
success+1不会修改原变量值,需要写成success += 1 - 缩进错误:判断失败的
else应该和if对齐,而非和for循环对齐 - 全局变量修改需要加
global声明,否则会被识别为局部变量报错
修复后完整代码
from kivy.app import App from kivy.uix.label import Label from kivy.uix.gridlayout import GridLayout from kivy.uix.textinput import TextInput from kivy.uix.button import Button import random # 更规范的做法是把计数作为类属性,这里保留你原有的全局变量写法做最小修改 success = 0 fails = 0 class mygridlayout(GridLayout): def __init__(self, **kwargs): super(mygridlayout, self).__init__(**kwargs) self.cols = 2 self.add_widget(Label(text="掷骰次数")) self.rolls = TextInput(multiline=False) self.add_widget(self.rolls) self.add_widget(Label(text="命中阈值(大于等于该值即命中)")) self.hits = TextInput(multiline=False) self.add_widget(self.hits) self.submit = Button(text="开始掷骰", font_size=32) self.submit.bind(on_press=self.press) self.add_widget(self.submit) def press(self, instance): global success, fails # 每次掷骰前重置计数,删除的话会累计历史结果 success = 0 fails = 0 # 输入转整数,加简单容错避免输入非数字报错 try: rolls_count = int(self.rolls.text) hit_threshold = int(self.hits.text) except ValueError: self.add_widget(Label(text="请输入有效的数字!")) return # 按指定次数掷骰 for _ in range(rolls_count): die = random.randint(1, 6) if die >= hit_threshold: success += 1 else: fails += 1 print(f"{success} 次成功,{fails} 次失败") self.add_widget(Label(text=f"本次结果:{success} 成功,{fails} 失败")) class myapp(App): def build(self): return mygridlayout() if __name__ == '__main__': myapp().run()
内容的提问来源于stack exchange,提问作者meka
相关产品推荐
相关产品推荐

