如何在Kivy中动态更改标签文本

时间:2018-08-08 16:29:39

标签: python-2.7 kivy

因此,我正在开发一个计算器/单位转换应用程序,并希望标签随着文本输入值的变化而动态显示计算结果。例如,假设该计算部分是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())

2 个答案:

答案 0 :(得分:1)

  1. 在调用run()方法或return FLOAT_LAYOUT之前将按钮绑定语句移动到
  2. calculate()方法中添加一个名为instance / obj的参数

documentation

  

通常, 属性回调 使用 2个参数 (对象   以及属性的新值)和 事件回调 ,并带有 一个参数   (对象)。

代码段-选项1:按钮在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)
        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()

代码段-选项2:在build()方法内绑定按钮

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()