Python Kivy编写简易计算器运行触发TypeError报错求助
Kivy简易计算器运行报错原因与修复方案
报错直接原因
控制台抛出的TypeError: object.__init__() takes exactly one argument由TextInput初始化代码触发:
self.calc = TextInput(Multiline = False)
Kivy所有组件的公开属性全部使用小写蛇形命名,不存在大写开头的Multiline参数,正确参数名为全小写的multiline。
Kivy组件的初始化逻辑会匹配传入的关键字参数和自身预定义属性,未被识别的参数会沿着继承链逐层向上透传给父类的初始化方法,最终传到最顶层基类object时,因为object的初始化方法不接受任何自定义参数,就抛出了该类型错误。
代码中其他隐藏问题
就算修正了上述参数名错误,代码还有4处会导致运行异常的问题:
- 按钮事件绑定存在两处错误:一是按钮点击触发的事件属性名为
on_press,不存在in_press这个事件;二是绑定时传入的是函数引用,不能在函数名后加()——加括号会在界面初始化阶段直接执行计算函数,最终绑定的是函数返回值(None),后续点击按钮不会触发任何逻辑。 - 运算数类型错误:从
TextInput中读取的内容是字符串类型,直接对字符串做减法、乘法运算会触发类型错误,必须先转换为float/int数值类型才能做算术运算。 - 加法逻辑错误:现有代码中
b[0] + b[2]是字符串拼接操作,不是数值加法,和其他运算符的逻辑预期不符。 - 布局与鲁棒性问题:GridLayout固定为2列,每次计算直接新增Label组件会打乱原有布局排版;代码未做输入合法性校验,用户输入不符合
数字 运算符 数字的空格分隔格式时,会直接抛出索引错误导致程序崩溃。
修复后的可运行代码
import kivy 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 class mygl(GridLayout): def __init__(self, **kwargs): super(mygl, self).__init__(**kwargs) self.cols = 2 self.padding = 20 self.spacing = 10 self.add_widget(Label(text="input calculation :", font_size=20)) # 修正参数名为全小写multiline self.calc = TextInput(multiline=False, font_size=20) self.add_widget(self.calc) self.sub = Button(text="Submit", font_size=20) self.add_widget(self.sub) # 修正事件绑定:使用正确的on_press事件名,传入函数引用不加括号 self.sub.bind(on_press=self.press) # 预定义结果展示标签,避免反复新增组件打乱布局 self.result_label = Label(text="计算结果将展示在这里", font_size=20) self.add_widget(self.result_label) def press(self, instance): input_content = self.calc.text.strip() try: # 分割输入做格式校验,统一转换数值类型 num1_str, op, num2_str = input_content.split(" ") num1 = float(num1_str) num2 = float(num2_str) if op == "+": res = num1 + num2 elif op == "-": res = num1 - num2 elif op == "X": res = num1 * num2 elif op == "/": if num2 == 0: self.result_label.text = "错误:除数不能为0" return res = num1 / num2 else: self.result_label.text = "错误:仅支持+、-、X、/运算符" return self.result_label.text = f"计算结果:{res}" except ValueError: self.result_label.text = "输入格式错误,请按「数字 运算符 数字」格式输入,用空格分隔" except Exception as e: self.result_label.text = f"计算出错:{str(e)}" class calculator(App): def build(self): return mygl() if __name__ == "__main__": calculator().run()
修复说明
- 修正了所有Kivy组件的参数名、事件名拼写,严格遵循Kivy的小写命名规范
- 事件绑定传入函数引用而非函数调用结果,保证点击按钮时才执行计算逻辑
- 增加了输入格式校验、类型转换、异常捕获逻辑,避免非法输入导致程序崩溃
- 预定义结果展示标签,避免动态新增组件打乱网格布局结构
- 补充了除法运算、错误提示,计算器功能完整性更高
内容的提问来源于stack exchange,提问作者Aditya Mohnot
相关产品推荐
相关产品推荐

