2014-12-08 3 views
6

Используя Kivy Screen Manager, я создаю два экрана. Пока я на экране 1, я хочу изменить ярлык на экране два. Я выделить проблемные области в моем коде:Kivy - Screen Manager - Доступ к атрибуту в другом классе

мой 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" 

и мой 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() 

Любая помощь очень ценится! Спасибо, Нико

ответ

11

Как об этом:

При нажатии кнопки на MenuScreen, он устанавливает атрибут на себя, содержащий текст, который вы хотите поместить в Настройкинажмите Label. Затем MenuScreen назначается значение id в файле kv, которое используется для ссылки на этот атрибут. Пример:

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

киловольт файл

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 

Как вы можете видеть, я установил имена и идентификатор экранов под самой ScreenManager в файле кВ , поскольку это то, что я обычно делал, чтобы сделать эту работу.

+0

да! оно работает! Спасибо, человек, ты гений !!! :-) – BuroBernd

+0

Мне нужно было импортировать свойства: 'from kivy.properties import StringProperty' – amd