kivy:更改动态生成的标签的标签文本

Posted

技术标签:

【中文标题】kivy:更改动态生成的标签的标签文本【英文标题】:kivy: changing label text of dynamically generated label 【发布时间】:2017-03-14 20:00:54 【问题描述】:

最后,labels.text 应该显示传感器数据。数据在单独的进程中生成,并通过管道传输到 kivy。目前我正在尝试实现一个非常简单的最小示例。但是,我不了解动态生成标签的更新概念:

from math import sin

"""
Activate the touch keyboard. It is important that this part is on top
because the global config should be initiated first.
"""
from kivy.config import Config
Config.set('kivy', 'keyboard_mode', 'multi')

from kivy.app import App

from kivy.clock import Clock
# The Builder is used to define the main interface.
from kivy.lang import Builder

from kivy.properties import StringProperty, ObjectProperty, NumericProperty
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.stacklayout import StackLayout


import numpy as np

class MainScreen(Screen):
    pass


class DataScreen(Screen):

    def __init__(self, **kwargs):
        layout = StackLayout()
        super(DataScreen, self).__init__(**kwargs)
        self.n_probes = 8
        self.label_text = []
        for i in range(self.n_probes):
            self.label_text.append(StringProperty())
            self.label_text[i] = str(i)

        for i in range(self.n_probes):
            l = Label(id='l_'.format(i),
                      name='l_'.format(i),
                      text=self.label_text[i],
                      font_size='60sp',
                      height=20,
                      width=20,
                      size_hint=(0.5, 0.2))
            self.ids.stack.add_widget(l)

    def change_text(self):
        for i in range(self.n_probes):
            self.label_text[i] = str(2)



Builder.load_file('phapp.kv')

class MyApp(App):
    """
    The settings App is the main app of the pHBot application.
    It is initiated by kivy and contains the functions defining the main interface.
    """


    def build(self):
        """
        This function initializes the app interface and has to be called "build(self)".
        It returns the user interface defined by the Builder.
        """

        sm = ScreenManager()
        sm.add_widget(MainScreen())
        sm.add_widget(DataScreen())
        # returns the user interface defined by the Builder
        return sm


if __name__ == '__main__':
    MyApp().run()

.kv 文件:

<MainScreen>:
    name: 'main'
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: 'Go to data'
            font_size: 40
            on_release: app.root.current = 'data'
        Button:
            text: 'Exit'
            font_size: 40
            on_release: app.stop()

<DataScreen>:
    name: 'data'
    StackLayout:
        id: stack
        orientation: 'lr-tb'
    BoxLayout:
        Button:
            size_hint: (0.5, 0.1)
            text: 'Update'
            font_size: 30
            on_release: root.change_text()
        Button:
            size_hint: (0.5, 0.1)
            text: 'Back to main menu'
            font_size: 30
            on_release: app.root.current = 'main'

标签不会随此版本更新。任何想法为什么?

【问题讨论】:

【参考方案1】:

此版本正在运行。我现在仍然不知道为什么第一个没有成功。也许它必须与范围有关?如果我在 .kv 文件和 .py 文件中静态编码所有内容(例如,在这个 SO post 中)一切正常。

from math import sin

"""
Activate the touch keyboard. It is important that this part is on top
because the global config should be initiated first.
"""
from kivy.config import Config
Config.set('kivy', 'keyboard_mode', 'multi')

from kivy.app import App

from kivy.clock import Clock
# The Builder is used to define the main interface.
from kivy.lang import Builder

from kivy.properties import StringProperty, ObjectProperty, NumericProperty
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.stacklayout import StackLayout


import numpy as np

class MainScreen(Screen):
    pass


class DataScreen(Screen):

    def __init__(self, **kwargs):
        layout = StackLayout()
        super(DataScreen, self).__init__(**kwargs)
        self.n_probes = 8
        self.label_text = []
        for i in range(self.n_probes):
            self.label_text.append(StringProperty())
            self.label_text[i] = str(i)
        self.l = []
        for i in range(self.n_probes):
            self.l.append(Label(id='l_'.format(i),
                          text='Start '.format(i),
                          font_size='60sp',
                          height=20,
                          width=20,
                          size_hint=(0.5, 0.2)))
            self.ids.stack.add_widget(self.l[i])

    def change_text(self):
        for i in range(self.n_probes):
            self.l[i].text = 'Update' + str(2)


Builder.load_file('phapp.kv')

class MyApp(App):
    """
    The settings App is the main app of the pHBot application.
    It is initiated by kivy and contains the functions defining the main interface.
    """


    def build(self):
        """
        This function initializes the app interface and has to be called "build(self)".
        It returns the user interface defined by the Builder.
        """

        sm = ScreenManager()
        sm.add_widget(MainScreen())
        sm.add_widget(DataScreen())
        # returns the user interface defined by the Builder
        return sm


if __name__ == '__main__':
    MyApp().run()


<MainScreen>:
    name: 'main'
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: 'Go to data'
            font_size: 40
            on_release: app.root.current = 'data'
        Button:
            text: 'Exit'
            font_size: 40
            on_release: app.stop()

<DataScreen>:
    name: 'data'
    StackLayout:
        id: stack
        orientation: 'lr-tb'
    BoxLayout:
        Button:
            size_hint: (0.5, 0.1)
            text: 'Update'
            font_size: 30
            on_release: root.change_text()
        Button:
            size_hint: (0.5, 0.1)
            text: 'Back to main menu'
            font_size: 30
            on_release: app.root.current = 'main'

【讨论】:

以上是关于kivy:更改动态生成的标签的标签文本的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 更新动态标签文本

如何使用在列表项单击时动态生成的文本视图标签突出显示我在列表视图中的当前位置

似乎无法使用动态生成的元素ID

滚动小部件中的 Kivy 标签文本换行

Kivy ObjectProperty 更新标签文本

动态生成的HTML标签样式问题