【问题标题】:How to dynamically change label text in Kivy如何在 Kivy 中动态更改标签文本
【发布时间】:2018-08-09 07:15:36
【问题描述】:

所以我正在制作一个计算器/单位转换应用程序,并且想要一个标签来随着文本输入值的变化而动态显示计算。例如,假设计算部分只是乘以 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())

【问题讨论】:

    标签: python-2.7 kivy


    【解决方案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()
    

    【讨论】:

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

      Event dispatcher » bind()

      一般来说,属性回调使用 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()
      

      【讨论】:

      • 好吧,我看到很多人加instance。那有什么作用?
      • 事件回调,例如on_presson_releaseon_<event> 使用一个参数(对象)调用。请参阅更新后的 Kivy 文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2017-10-08
      • 1970-01-01
      • 2019-11-26
      • 2017-01-25
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多