2014-12-08 7 views
6

Utilizzando Kivy Screen Manager, creo due schermate. Pur essendo nello schermo 1, voglio cambiare un'etichetta nella seconda schermata. Evidenzio l'area problematica nel mio codice:Kivy - Screen Manager - Accesso all'attributo in un'altra classe

mia test.ky:

#: import ScreenManager kivy.uix.screenmanager.ScreenManager 
#: import Screen kivy.uix.screenmanager.ScreenManager 
#: import SettingsScreen screen 


ScreenManager: 
    MenuScreen: 
    SettingsScreen: 


<MenuScreen>: 
    name: 'MenuScreen' 
    BoxLayout: 
     Button: 
      text: 'Goto nn' 
      on_press: 
       root.manager.current = 'SettingsScreen' 
       root.change_text() 


<SettingsScreen>: 
    name: 'SettingsScreen' 
    label_id: label_field 
    BoxLayout: 
     Label: 
      id: label_field 
      text: "to_be_changed" 

e la mia screen.py

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.screenmanager import ScreenManager, Screen 


class MenuScreen(Screen): 
    def change_text(self): 
     pass 
     # HERE: something like 
     # root.SettingsScreen.label_field.text = 'new text' 


class SettingsScreen(Screen): 
    pass 


class TestApp(App): 
    pass 

TestApp().run() 

Qualsiasi aiuto è molto apprezzato! Grazie, Nico

risposta

11

ne dite di questo:

Quando si preme il pulsante sulla schermata MENU, imposta un attributo su se stessa che contiene il testo che si desidera mettere in etichetta schermata Impostazioni. Quindi a MenuScreen viene assegnato un valore id nel file kv, che viene utilizzato per fare riferimento a questo attributo. Esempio:

main.py

class MenuScreen(Screen): 
    text = StringProperty('') 
    def change_text(self): 
     self.text = "The text you want to set" 
     self.manager.current = "SettingsScreen" 

class SettingsScreen(Screen): 
    label_text = StringProperty('') 

file di kv

ScreenManager: 
    id: screen_manager 
    MenuScreen: 
     id: menu_screen 
     name: 'MenuScreen' 
     manager: screen_manager 
    SettingsScreen: 
     name: 'SettingsScreen' 
     manager: screen_manager 
     label_text: menu_screen.text 

<MenuScreen>: 
    BoxLayout: 
     Button: 
      text: 'Goto nn' 
      on_press: 
       root.change_text() 

<SettingsScreen>: 
    BoxLayout: 
     Label: 
      text: root.label_text 

Come potete vedere, ho impostato i nomi e id degli schermi sotto ScreenManager stesso nel file kv , come questo è quello che farei di solito per farlo funzionare.

+0

sì! Funziona! Grazie amico, sei un genio !!! :-) – BuroBernd

+0

Ho bisogno di importare le proprietà: 'da kivy.properties import StringProperty' – amd