2017-08-08 72 views
1

这是我之前提出的关于如何更改一个kivy部件的属性(更新另一个类中的kivy标签文本)的问题的后续步骤。我一直在努力弄清楚为什么Meniscreen的温度读数在更新,但在Mashscreen内,文本不会更新。它看起来像正在传递给eh temperature1def方法的值,但屏幕小部件不会更新。更新另一个类中的kivy标签文本

而且,是它更好地利用发送

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

首先...

Mashscreen().temperature1def(self.test_temp) 

这不叫temperature1def方法对你Mashscreen例如在UI,相反,它会创建一个新的Mashscreen实例,调用该方法就可以了,然后让这个对象被python垃圾收集。如果你想更新你的用户界面,你需要获得一个你想更新的小部件的参考。

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

App.get_running_app()将返回到您的当前运行的应用程序,其中有一个root属性,它是你的根小工具,规则的根任何小部件可以使用其ids属性去定义任何标识的基准的基准其范围,所以。

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' 
相关问题