如何从连续 运行 函数动态更新 Kivy 标签?

How to dynamically update a Kivy label from a continuously running function?

我正在尝试连续使用一个函数 运行 并吐出标签使用的距离,我最终会绑定到声纳模块,但标签仍然空白,我不知所措我做错了什么。如果我只是为那个距离变量添加一个打印语句,它就可以打印和更新,只是无法让标签使用它。

我的问题的第二部分是如何在第二个 window 中引用相同的函数,并且还有一个从相同函数更新的标签?

提前感谢您的帮助,我是 kivy 的新手,几个月前才开始学习 python。

Python代码:

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen  # for multiple screens
from kivy.properties import StringProperty


class MySonar(Screen):
    global i
    i = 1

    distance = StringProperty("")

    #Generic function that just adds itself up, just using to try and get the label to change before I throw in my real function
    def sonar(self):
        global i

        if i < 250:
            distance = (10 + .1 * i)
            i += 1

        else:
            i = 1
            distance = 10

        self.root.distance=str(distance)

class DropWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("help.kv")

class HelpMe(App):
    def build(self):

        #running interval update to keep running code above
        Clock.schedule_interval(lambda dt: MySonar.sonar(self), 0.1)

        return kv

if __name__ == "__main__":
    HelpMe().run()

基维:

WindowManager:
    MySonar:
    DropWindow:

<MySonar>:
    name:"Main"

    GridLayout:
        cols:1

        ##Need this to update
        Label:
            text:root.distance
        Button:
            text:"Next Window"
            on_release:
                app.root.current="Drop"
                root.manager.transition.direction="left"


<DropWindow>:
    name:"Drop"

    GridLayout:

        cols:1

        ##Need this to update, commented out the text so the program will run and you can see the blank label for part one of my question
        Label:
            ##text:root.distance

        Button:
            text:"Cancel"
            on_release:
                app.root.current="Main"
                root.manager.transition.direction="right"

为了简化对 distance 的访问,您可以将 StringProperty 放在 HelpMe App:

class MySonar(Screen):
    global i
    i = 1

    #Generic function that just adds itself up, just using to try and get the label to change before I throw in my real function
    def sonar(self):
        global i

        if i < 250:
            distance = (10 + .1 * i)
            i += 1

        else:
            i = 1
            distance = 10

        # set the value of distance in the StringProperty of the App
        App.get_running_app().distance=str(distance)
        print(distance)

class DropWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

# kv = Builder.load_file("help.kv")


class HelpMe(App):
    distance = StringProperty('')

    def build(self):
        kv = Builder.load_file("help.kv")

        #running interval update to keep running code above
        sonar_instance = kv.get_screen('Main')
        Clock.schedule_interval(lambda dt: sonar_instance.sonar(), 0.1)

        return kv

if __name__ == "__main__":
    HelpMe().run()

请注意,我还将 Builder.load_file() 移到了 App 中。当您在 kv 文件中引用 app 时,这是一个很好的做法(就像我所做的那样)。此外,使用 MySonar.sonar(self) 调用 sonar() 方法将不起作用。您需要使用对 GUI 中 MySonar 实例的引用。

现在 kv 文件变为:

WindowManager:
    MySonar:
    DropWindow:

<MySonar>:
    name:"Main"

    GridLayout:
        cols:1

        ##Need this to update
        Label:
            text: app.distance
        Button:
            text:"Next Window"
            on_release:
                app.root.current="Drop"
                root.manager.transition.direction="left"


<DropWindow>:
    name:"Drop"

    GridLayout:

        cols:1

        ##Need this to update, commented out the text so the program will run and you can see the blank label for part one of my question
        Label:
            text: app.distance

        Button:
            text:"Cancel"
            on_release:
                app.root.current="Main"
                root.manager.transition.direction="right"

变化是 Labelstext 属性现在只是 app.distance.