如何在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)
更简便的优化实现
可以从输入过滤、异常校验两个维度优化,避免用户输入非法内容导致程序崩溃,同时简化使用体验:
- 定义TextInput时添加
input_filter参数,从源头限制只能输入浮点数 - 计算逻辑添加异常捕获,处理空输入、除零等边界情况
优化后的完整代码如下:
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
相关产品推荐
相关产品推荐

