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

如何在Kivy中实现TextInput与float互相转换完成计算器计算功能?

问题解决方法

错误根源

报错的核心原因是你把TextInput控件对象本身当成了输入内容处理:self.ROE_input 是控件实例,不是用户输入的字符串,调用str(ROE)得到的只是控件的内存地址描述,自然无法转换为float类型。Kivy中TextInput的用户输入内容存储在text属性中,直接读取该属性即可。


最小修改方案

仅修改calculate方法的取值逻辑即可解决报错:

def calculate(self, instance):
    # 直接取控件text属性获取输入内容
    f_ROE = float(self.ROE_input.text)
    f_Growth = float(self.Growth_input.text)
    f_Rorr = float(self.Rorr_input.text)
    f_value = (f_ROE - f_Growth) / (f_Rorr - f_Growth)
    self.Stock_Value_2.text = str(f_value)

更简便的优化实现

可以从输入过滤、异常校验两个维度优化,避免用户输入非法内容导致程序崩溃,同时简化使用体验:

  1. 定义TextInput时添加input_filter参数,从源头限制只能输入浮点数
  2. 计算逻辑添加异常捕获,处理空输入、除零等边界情况

优化后的完整代码如下:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.core.window import Window


class Stonks(App):
    def build(self):
        layout = BoxLayout(orientation="vertical", spacing = 10, padding = 40)

        Instruction = Label(text = "股票价值计算器。输入对应数值即可得到基于市净率计算的股票内在价值,最适合价值股使用。", bold = True, font_size = "20sp", )

        ROE_Label = Label(text = "公司ROE是多少?")
        # 添加input_filter限制只能输入浮点数
        self.ROE_input = TextInput(multiline = False, input_filter="float")

        Growth_Label = Label(text = "公司年增长率是多少?")
        self.Growth_input = TextInput(multiline = False, input_filter="float")

        Rorr_Label = Label(text = "你的预期收益率(%)是多少?")
        self.Rorr_input = TextInput(multiline = False, input_filter="float")

        self.Stock_Value = Button(text = "计算股票价值(€)", on_press = self.calculate)
        self.Stock_Value_2 = Label (text = "")

        layout.add_widget(Instruction)
        layout.add_widget(ROE_Label)
        layout.add_widget(self.ROE_input)
        layout.add_widget(Growth_Label)
        layout.add_widget(self.Growth_input)
        layout.add_widget(Rorr_Label)
        layout.add_widget(self.Rorr_input)
        layout.add_widget(self.Stock_Value)
        layout.add_widget(self.Stock_Value_2)
        return layout

    def calculate(self, instance):
        try:
            f_ROE = float(self.ROE_input.text.strip())
            f_Growth = float(self.Growth_input.text.strip())
            f_Rorr = float(self.Rorr_input.text.strip())
            # 处理除零异常
            if abs(f_Rorr - f_Growth) < 1e-9:
                self.Stock_Value_2.text = "预期收益率不能等于增长率"
                return
            f_value = (f_ROE - f_Growth) / (f_Rorr - f_Growth)
            # 格式化输出保留2位小数更友好
            self.Stock_Value_2.text = f"{f_value:.2f} €"
        except ValueError:
            self.Stock_Value_2.text = "请填写所有输入项的合法数值"


Stonks().run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:03