【问题标题】:How to automatically update Kivy label created inside Python using Kivy properties如何使用 Kivy 属性自动更新在 Python 中创建的 Kivy 标签
【发布时间】:2021-02-16 16:27:58
【问题描述】:

我想实现以下内容:

使用add_widget() 函数在 python 中创建一个 Kivy 标签。但是,我想受益于标签在文本变量更改时自动更新的事实(在我的情况下为self.gui_data.number)。我知道在 .kv 文件中添加标签时可以实现这一点,但是在我的情况下这是不可能的,因为我需要在运行时构建部分 GUI。

下面是一个最小示例的代码。有一个按钮add label 添加标签,目标是如果按下decrement 按钮,标签就会改变。不幸的是,事实并非如此。

感谢任何帮助。谢谢!

main.py

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.widget import Widget
  
import parameters


from kivy.properties import StringProperty
from kivy.event import EventDispatcher

  
class PongBall(Widget):
    gui_data = parameters.Data()
  
    def add_label(self):
        self.gui_data.number = self.gui_data.number + '5'
        label = Label(text=str(self.gui_data.number))
        self.ids.board.add_widget(label)
  
    def decrement(self):
        self.gui_data.number = self.gui_data.number + '6'
  
    def reset_parameters(self):
        self.gui_data.reset()

class PongApp(App):
    def build(self):
        game = PongBall()
        return game
  
if __name__ == '__main__':
    PongApp().run()

parameters.py

from kivy.properties import StringProperty
from kivy.event import EventDispatcher
  
  
class Data(EventDispatcher):
    number = StringProperty("0")
     
    def reset(self):
        self.number = "0"

pong.kv

<PongBall>:
    BoxLayout:
        orientation: "vertical"
        id: board
     
        Button:
            text: "Add label"
            on_press: root.add_label()
     
        Button:
            text: "Decrement"
            on_press: root.decrement()
     
        Button:
            text: "Reset parameters"
            on_press: root.reset_parameters()

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    为了做你想做的事,你需要一个可以绑定的Property。在下面您的代码的修改版本中,我在 PongBall 类中添加了一个 number Property

    class PongBall(Widget):
        gui_data = Data()
        number = StringProperty(gui_data.number)   # Property for binding
    
        def add_label(self):
            self.gui_data.number = self.gui_data.number + '5'
            label = Label(text=str(self.gui_data.number))
    
            # bind to the number Property
            self.bind(number=partial(self.number_changed, label))
            
            self.ids.board.add_widget(label)
    
        def number_changed(self, label, pongball, number):
            # change the Label text
            label.text = number
    
        def decrement(self):
            self.gui_data.number = self.gui_data.number + '6'
    
        def reset_parameters(self):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2018-10-06
      • 2015-06-09
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多