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

时间:2017-08-08 23:39:57

标签: python object widget label kivy

这是我之前提出的关于如何更改kivy小部件属性的问题的后续跟进(更新另一个类中的kivy标签文本)。我一直试图弄清楚为什么Menuscreen上的温度读数会更新,但在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()

1 个答案:

答案 0 :(得分:1)

首先...

    Mashscreen().temperature1def(self.test_temp)

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

您可以在应用程序的根规则中定义Mashscreen,这样您就可以通过此对象中的id来获取它。

App.get_running_app()将返回对您当前正在运行的应用的引用,该应用具有root属性,这是您的根小部件,规则根目录下的任何小部件都可以使用其ids attribute来获取对其范围中定义的任何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类更改为温度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'