如何使用Kivy属性自动更新Python内部创建的Kivy标签

2024-04-20 03:54:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望实现以下目标:

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

参数.py

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

庞千伏

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

Tags: textfromimportselfaddnumberdatadef
1条回答
网友
1楼 · 发布于 2024-04-20 03:54:12

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

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

相关问题 更多 >