如何在Kivy的kv文件中为提交按钮绑定calculations计算函数
问题核心原因&修复步骤
你现在绑定失败是两个核心问题导致的,按下面步骤修改即可:
- 方法所属类不匹配
你把calculations方法写在了MyApp类中,但kv文件里调用的root.calculations()中的root指的是MyGrid组件,MyGrid类中并没有这个方法,所以会触发报错。你可以选择把calculations方法挪到MyGrid类中,或者把kv里的调用逻辑改成app.calculations()。 - 缺少结果回写逻辑
你现在的计算逻辑只把值存在了临时变量里,没有把结果赋值到界面对应的输入框中,点击后看不到计算效果。 - 可选优化:增加输入异常捕获,避免用户输入非数字内容时程序崩溃。
修正后的完整代码
Python文件
import kivy from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import ObjectProperty class MyGrid(Widget): def calculations(self): # 增加异常校验避免输入非数字崩溃 try: org_amount = float(self.ids.orgamount.text) org_tip = int(self.ids.orgtip.text) org_split = int(self.ids.split1.text) except ValueError: return tip1 = org_tip/100 tip = round(tip1 * org_amount, 2) total = round(tip + org_amount, 2) if org_split == 0: split = 0 else: split = round(total/org_split,2) # 把结果回写到界面控件 self.ids.amount.text = str(org_amount) self.ids.tip.text = str(tip) self.ids.withtip.text = str(total) self.ids.patronsplit.text = str(split) class MyApp(App): def build(self): return MyGrid() if __name__ == "__main__": MyApp().run()
KV文件(注意kv文件名要和App类名前缀匹配,比如这里命名为my.kv即可自动加载)
<MyGrid>: title: 'tipBot v1.0' auto_dismiss: False GridLayout: cols:2 size: root.width * 0.8, root.height * 0.8 row_default_height: 30 row_force_default: True center: root.width/2, root.height/2 Label: text: "Enter original bill amount: " TextInput: id: orgamount hint_text: 'Enter number w/ 2 decimal places' hint_text_color: 'blue' multiline:False Label: text: "How much tip will you leave: " TextInput: id: orgtip hint_text: 'Enter whole number' hint_text_color: 'blue' multiline:False Label: text: "How many patrons will split the bill: " TextInput: id: split1 multiline: False Label: text: "Original Bill Amount: " TextInput: id: amount multiline: False Label: text: "Amount of tip: " TextInput: id: tip multiline: False Label: text: "Total with tip: " TextInput: id: withtip multiline: False Label: text:"Amount for each patron split: " TextInput: id:patronsplit multiline: False Button: id: Clear text: "Clear" size_hint_x: 0 on_release: orgamount.text = '' orgtip.text = '' split1.text = '' amount.text = '' tip.text = '' withtip.text = '' patronsplit.text ='' Button: id: Submit text: "Submit" size_hint_x:0.5 on_press: root.calculations()
Kivy学习实用技巧
- 先搞清楚kv语言中
root、app、self三个关键字的指向:root是当前kv规则对应的组件类,app是运行的App类实例,self是当前组件本身 - 所有用户输入的内容默认都是字符串类型,做数值计算前一定要做类型校验和异常捕获,避免程序崩溃
- 组件ID只在对应
root组件的ids字典里生效,不要跨组件直接调用ids - 新手可以先从官方提供的小demo入手修改,熟悉组件的基本属性和事件绑定逻辑后再做自定义项目
内容的提问来源于stack exchange,提问作者will0772
相关产品推荐
相关产品推荐

