如何从另一个 class 更新一个 kivy 标签

How to update a kivy label from another class

import kivy
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout


class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.rows = 2
        self.accel  = Label(text = "unknown")
        self.orein = Label(text = "unknown")
        self.add_widget(self.accel)
        self.add_widget(self.orein)

class MyApp(App):
    def build(self):
        return MyGrid()
        Clock.schedule_interval(self.update, 1)

    def update(self, dt):
        ac = "dfskjjlfh"
        ore = "kjdsfkjdf"
        App.accel.text = ac
        App.orein.text = ore

MyApp().run()

我无法找到如何从另一个 class 更新标签的答案。我不断收到以下错误:

The following code is unreachable

两个小部件都卡在未知字符串中,但不会更改为函数更新中的变量。

我不知道你提到的错误:

The following code is unreachable

可能是您使用的 IDLE 导致了错误(因为您发布的代码永远不会抛出此类错误)。

但是,您的代码确实存在一些问题。

首先,在方法 build 中,您做到了,

    def build(self):
        return MyGrid()
        Clock.schedule_interval(self.update, 1)

由于您return先安排回调,您的回调函数将永远不会被执行。所以你需要调换他们的顺序。

其次,在方法 update 中你做了 App.accel.text。这将引发 AttributeError,因为 App class 没有这样的 属性 accel。此外,它甚至不存在于 App class 的实例中(即在 MyApp 中)。您通常不需要直接引用 App class,而是它的实例(除了某些方法,如 get_running_app 等)

您似乎想访问 MyAppMyGrid 的 属性,在方法 build 中创建该 class 的实例,从而您将能够访问您在 class 中定义的任何属性。因此,您修改后的 MyApp 现在应该看起来像

class MyApp(App):
    def build(self):
        self.grid = MyGrid() # Creating an instance.
        Clock.schedule_interval(self.update, 1.)
        return self.grid

    def update(self, dt):
        ac = "dfskjjlfh"
        ore = "kjdsfkjdf"
        # Now access that instance and its properties.
        self.grid.accel.text = ac
        self.grid.orein.text = ore