2017-08-08 34 views
1

これは、kivyウィジェットのプロパティを変更する方法(他のクラスのkivyラベルテキストを更新する方法)について質問した前回の質問のフォローアップです。私はMenuscreenの温度の読みがなぜ更新されるのかを理解しようとしていましたが、マッシュスクリーンではテキストは更新されません。値がeh temperature1defメソッドに渡されているようですが、画面ウィジェットは更新されません。別のクラスのkivyラベルテキストを更新する

はまた、

Mashscreen().temperature1def(self.test_temp) 

を使用して値を送信する方が良いですかMashscreen内のラベルを更新するMenuScreen内

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

を使用するより良い練習ですか?前もって感謝します。

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) 

これにメソッドを呼び出し、その後、聞かせて、代わりに、それは新しいMashscreenインスタンスを作成し、UIであなたのMashscreenインスタンスでtemperature1defメソッドを呼び出すことはありません。このオブジェクトは、Pythonによってガベージコレクションされます。 UIを更新する場合は、更新するウィジェットへの参照を取得する必要があります。

あなたは、このオブジェクトでそのIDによってそれを得ることができるようにするには、アプリケーションのルートルールであなたのMashscreenを定義します。

App.get_running_app()ルールのルートにある任意のウィジェットがその中で定義された任意のidへの参照を取得するために、そのids属性を使用することができ、あなたのルートウィジェットですroot属性を持っているあなたの現在実行中のアプリへの参照を返します。スコープ、そう。

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

は、あなたが実際にやりたがっているようなものです。

は今、Pythonのkivyで最高のそれを行う方法についての質問に関しては、私はそれのような何かをするクリーナーだことがわかります。

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

、次いで温度NumericPropertyを持っているあなたのMashscreenクラスを変更するために、そしてLabelで、この値を使用するようにKVのルールを変更します。

<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' 
関連する問題