因此,我正在开发一个计算器/单位转换应用程序,并希望标签随着文本输入值的变化而动态显示计算结果。例如,假设该计算部分是3的简单乘积。因此,用户在文本输入中输入了5。然后,他们单击“计算”按钮,它将乘以3。然后,我希望标签显示此计算。目前,我不知道该如何实现! 这是我的代码:
import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
FLOAT_LAYOUT = FloatLayout(size=(300, 300))
title_label = Label(text='0',
font_size=20,
pos_hint={'x': .4, 'y': .8},
size_hint=(.2, .2))
text_box = TextInput(multiline=False,
font_size=20,
pos_hint={'x': .4, 'y': .3},
size_hint=(.2, .2))
calculate_button = Button(text='Calculate',
font_size=20,
pos_hint={'x': .4, 'y': .1},
size_hint=(.2, .1))
class calculator_app(App):
def build(self):
FLOAT_LAYOUT.add_widget(title_label)
FLOAT_LAYOUT.add_widget(text_box)
FLOAT_LAYOUT.add_widget(calculate_button)
return FLOAT_LAYOUT
def calculate(self):
title_label.text = str(float(text_box.text)*3)
calculator_object = calculator_app()
calculator_object.run()
calculate_button.bind(on_press=calculator_object.calculate())
很明显,我做错了什么。 .bind(on_press=...)
是否不是解决此问题的正确方法?预先感谢!
编辑:这是错误消息:
AssertionError: None is not callable
这与以下行有关:calculate_button.bind(on_press=calculator_object.calculate())
答案 0 :(得分:1)
run()
方法或return FLOAT_LAYOUT
之前将按钮绑定语句移动到calculate()
方法中添加一个名为instance / obj的参数通常, 属性回调 使用 2个参数 (对象 以及属性的新值)和 事件回调 ,并带有 一个参数 (对象)。
class calculator_app(App):
def build(self):
FLOAT_LAYOUT.add_widget(title_label)
FLOAT_LAYOUT.add_widget(text_box)
FLOAT_LAYOUT.add_widget(calculate_button)
return FLOAT_LAYOUT
def calculate(self, instance):
if len(text_box.text) > 0:
title_label.text = str(float(text_box.text)*3)
calculator_object = calculator_app()
calculate_button.bind(on_press=calculator_object.calculate)
calculator_object.run()
class calculator_app(App):
def build(self):
FLOAT_LAYOUT.add_widget(title_label)
FLOAT_LAYOUT.add_widget(text_box)
FLOAT_LAYOUT.add_widget(calculate_button)
calculate_button.bind(on_press=self.calculate)
return FLOAT_LAYOUT
def calculate(self, instance):
if len(text_box.text) > 0:
title_label.text = str(float(text_box.text)*3)
calculator_object = calculator_app()
calculator_object.run()
答案 1 :(得分:1)
您遇到以下错误:
在run()之后放置的内容仅在关闭窗口时运行,并且GUI的目标是在GUI打开时运行所有内容。
另一方面,bind方法要求您提供回调的名称,而不是您正在评估的回调。
bind传递必须由回调函数接收的参数,例如生成调用的实例(在本例中为按钮),因此应将这些值作为参数放置。
TextInput可以接收不是数字的值,例如在TextInput为空的情况下,这可能会引起问题,因此可能的解决方案是使用异常。
解决方案:
import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
FLOAT_LAYOUT = FloatLayout(size=(300, 300))
title_label = Label(text='0',
font_size=20,
pos_hint={'x': .4, 'y': .8},
size_hint=(.2, .2))
text_box = TextInput(multiline=False,
font_size=20,
pos_hint={'x': .4, 'y': .3},
size_hint=(.2, .2)
)
calculate_button = Button(text='Calculate',
font_size=20,
pos_hint={'x': .4, 'y': .1},
size_hint=(.2, .1))
class calculator_app(App):
def build(self):
FLOAT_LAYOUT.add_widget(title_label)
FLOAT_LAYOUT.add_widget(text_box)
FLOAT_LAYOUT.add_widget(calculate_button)
return FLOAT_LAYOUT
def calculate(self, *args):
print(args)
try:
title_label.text = str(float(text_box.text)*3)
except ValueError:
print("Not a float")
calculator_object = calculator_app()
calculate_button.bind(on_press=calculator_object.calculate)
calculator_object.run()