更新另一个 class 中的 kivy 标签文本

update a kivy label text in another class

这是对我之前询问过的关于如何更改 kivy 小部件的属性(更新另一个 class 中的 kivy 标签文本)的问题的跟进。我一直在试图弄清楚为什么菜单屏幕上的温度读数会更新,但在 Mashscreen 中,文本不会更新。看起来这些值正在传递给 eh temperature1def 方法,但屏幕小部件没有更新。

此外,使用

发送值是否更好?
Mashscreen().temperature1def(self.test_temp)

还是使用

更好
self.stuff_p.text = str(self.test_temp) + u'\u00B0F'

在 MenuScreen 中更新 Mashscreen 中的标签?提前致谢。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.clock import Clock

sm = """


ScreenManager:
    #Handling the gesture event.
    id:manager
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 0.5
        Rectangle:
            pos: 0,0
            size: 800, 480
    MenuScreen:
        id:MenuScreen
        name:'MenuScreen'
        manager: manager
    Mashscreen:
        id:Mashscreen
        name: 'Mashscreen'
        manager: manager



<MenuScreen>:
    stuff_r: mainel1temp
    Button:
        text: "Go to mashscreen"
        on_release:
            root.manager.current = "Mashscreen"

    Label:
        id: mainel1temp
        text:'0'
        size_hint: None, None
        size: 75,50
        pos: 295,308
        font_size:'22sp'
        text_size: self.size
        halign: 'left'
        valign: 'middle'


<Mashscreen>:
    stuff_p: temperature1
    FloatLayout:


        Label:
            id: temperature1
            text:'100'
            size_hint: None, None
            size: 75,50
            pos: 50,275
            font_size:'22sp'
            text_size: self.size
            halign: 'left'
            valign: 'middle'


"""

class MenuScreen(Screen):
    test_temp = 99
    stuff_r = ObjectProperty(None)

    def __init__(self,**kwargs):
        super(MenuScreen,self).__init__(**kwargs)
        Clock.schedule_interval((self.read_temp), 1)
        #self.read_temp(1)

    def read_temp(self, dt):

        self.test_temp += 1
        self.stuff_r.text = str(self.test_temp) + u'\u00B0F'
        Mashscreen().temperature1def(self.test_temp)
        #self.parent.ids.Mashscreen.stuff_p.text = str(self.test_temp) + u'\u00B0F'




class Mashscreen(Screen):
    stuff_p = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(Mashscreen, self).__init__(**kwargs)

    def temperature1def(self, temp1):
        print(temp1)
        self.stuff_p.text = str(temp1)

class TestApp(App):

    def build(self):

        return Builder.load_string(sm)

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

首先…

    Mashscreen().temperature1def(self.test_temp)

这不会在 UI 中的 Mashscreen 实例上调用 temperature1def 方法,而是创建一个新的 Mashscreen 实例,调用方法它,然后让这个对象被 python 垃圾回收。如果您想更新您的 UI,您需要获得对您要更新的小部件的引用。

你在你的应用程序的根规则中定义你的Mashscreen,所以你可以通过它在这个对象中的id来获取它。

App.get_running_app() 将 return 引用您当前的 运行 应用程序,它有一个 root 属性,这是您的根小部件,任何位于根的小部件规则可以使用其 ids 属性来获取对其范围内定义的任何 id 的引用,因此。

App.get_running_app().root.ids.Mashscreen.temperature1def(self.test_temp)

肯定会更像你真正想做的。

现在,关于如何在 python kivy 中做到最好的问题,我发现做类似的事情更干净。

App.get_running_app().root.ids.Mashscreen.temperature = self.test_temp

然后将您的 Mashscreen class 更改为具有温度 NumericProperty,并更改您的 kv 规则以在 Label.

中使用此值
<Mashscreen>:
    stuff_p: temperature1
    FloatLayout:
        Label:
            id: temperature1
            text: '%s' % root.temperature
            size_hint: None, None
            size: 75,50
            pos: 50,275
            font_size:'22sp'
            text_size: self.size
            halign: 'left'
            valign: 'middle'