2017-08-08 2 views
1

Ceci est une suite à une question précédente que j'ai posée sur la façon de changer les propriétés d'un widget kivy (mettre à jour un texte d'étiquette kivy dans une autre classe). J'ai essayé de comprendre pourquoi la lecture de la température sur les mises à jour de Menuscreen mais dans le Mashscreen, le texte ne met pas à jour. Il semble que les valeurs soient passées à la méthode eh temperature1def mais le widget d'écran ne se met pas à jour.mettre à jour un texte d'étiquette kivy dans une autre classe

Aussi, est-il préférable d'envoyer la valeur à l'aide

Mashscreen().temperature1def(self.test_temp) 

ou est-il préférable d'utiliser des

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

au sein de l'écran MENU de mettre à jour l'étiquette dans le Mashscreen? Merci d'avance.

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() 

Répondre

1

Première ...

Mashscreen().temperature1def(self.test_temp) 

Cela ne remet pas la méthode temperature1def sur votre Mashscreen par exemple dans l'interface utilisateur, à la place, il crée une nouvelle instance Mashscreen, appelle la méthode sur elle, puis nous cet objet doit être récupéré par Python. Si vous souhaitez mettre à jour votre interface utilisateur, vous devez obtenir une référence au widget que vous souhaitez mettre à jour.

Vous définissez votre Mashscreen dans la règle racine de votre application, vous pouvez donc l'obtenir par son identifiant dans cet objet.

App.get_running_app() renverra une référence à votre application en cours d'exécution, ce qui a un attribut root, qui est votre widget racine, ne importe quel widget à la racine d'une règle peut utiliser son ids attribut pour obtenir une référence à un identifiant défini dans son portée, donc.

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

sera certainement plus comme ce que vous voulez réellement faire. Maintenant, en ce qui concerne la meilleure façon de le faire en python kivy, je trouve qu'il est plus propre de faire quelque chose comme ça.

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

puis changer votre classe Mashscreen d'avoir une température NumericProperty et de changer votre règle kv d'utiliser cette valeur dans le 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'