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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:57:12