2017-08-08 109 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' 
相關問題