【问题标题】:update a kivy label text in another class更新另一个类中的 kivy 标签文本
【发布时间】:2018-01-16 16:28:02
【问题描述】:

这是我之前询问过的关于如何更改 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()

【问题讨论】:

    标签: python object widget label kivy


    【解决方案1】:

    首先……

        Mashscreen().temperature1def(self.test_temp)
    

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

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

    App.get_running_app() 将返回对您当前正在运行的应用程序的引用,该应用程序具有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 类更改为具有温度 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'
    

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多