2016-12-31 16 views
0

Я пытаюсь обновить поле, существующее на другом экране, но не преуспеваю. Я был бы очень доволен, когда кто-то мог бы сказать мне, что я делаю неправильно здесь.Как ссылаться на объекты на других экранах с помощью kivy screenmanager

myscreenskv.py:

style = r''' 
# File: myscreenskv.py 
#: import myscreens myscreens 

<ScreenManagement>: 
    MainScreen: 
    Screen1: 
    Screen2: 

<MainScreen>: 
    name: 'main' 
    mainlog:mainlog 
    id: scrmain 
    BoxLayout: 
     orientation: "vertical" 
     Label: 
      text: "Main" 
     Label: 
      id: mainlog 
     Button: 
      text: "go to screen 1" 
      on_press: 
       app.root.current = "screen1" 
       root.action1() 
     Button: 
      text: "go to screen 2" 
      on_press: 
       app.root.current = "screen2" 
       root.action2() 

<Screen1>: 
    name: 'screen1' 
    sc1log:sc1log 
    id: scr1 
    BoxLayout: 
     orientation: "vertical" 
     Label: 
      text: "Screen1" 
     Label: 
      id: sc1log 
     Button: 
      text: "go to main screen" 
      on_press: app.root.current = "main" 
     Button: 
      text: "go to screen 2" 
      on_press: app.root.current = "screen2" 

<Screen2>: 
    name: 'screen2' 
    id: scr2 
    sc2log:sc2log 
    BoxLayout: 
     orientation: "vertical" 
     Label: 
      text: "Screen2" 
     Label: 
      id: sc2log 
     Button: 
      text: "go to main screen" 
      on_press: app.root.current = "main" 
     Button: 
      text: "go to screen 1" 
      on_press: app.root.current = "screen1" 

''' 

.py:

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.lang import Builder 
from myscreenskv import style 

class MainScreen(Screen): 
    def __init__(self, **kwargs): 
     super(MainScreen, self).__init__(**kwargs) 

    def action1(self): 
     self.ids.scr1.sc1log.text = 'Coming from main' 

    def action2(self): 
     self.ids.scr2.sc2log.text = 'Coming from main' 

class Screen1(Screen): 
    def __init__(self, **kwargs): 
     super(Screen1, self).__init__(**kwargs) 

    def action1(self): 
     self.ids.main.mainlog.text = 'Coming from screen1' 

    def action2(self): 
     self.ids.scr2.sc2log.text = 'Coming from screen1' 


class Screen2(Screen): 
    def __init__(self, **kwargs): 
     super(Screen2, self).__init__(**kwargs) 

    def action1(self): 
     self.ids.main.mainlog.text = 'Coming from screen2' 

    def action2(self): 
     self.ids.scr1.sc1log.text = 'Coming from screen2' 

class MyscreensApp(App): 
    def build(self): 
     Builder.load_string(style) 
     sm = ScreenManager() 
     sm.add_widget(MainScreen()) 
     sm.add_widget(Screen1()) 
     sm.add_widget(Screen2()) 
     sm.current = 'main' 
     return sm 


if __name__ == '__main__': 
    MyscreensApp().run() 

ответ

1

Вы пытаетесь получить доступ ids словарь, который хорошо, но в совершенно ином случае, именно поэтому этот ошибка:

AttributeError: 'super' object has no attribute '__getattr__' 

Вам необходимо получить доступ к правильному экземпляру, чтобы иметь доступ к его свойствам, что в вашем случае вам необходимо получить доступ к ScreenManager, чтобы получить доступ к свойству screens (список экземпляров), из которого вы можете сделать необходимые изменения например, текст:

MainScreen.action1():

self.manager.screens[1].sc1log.text = 'Coming from main' 
# no ids, because you put it into a variable before 

Чтобы понять, почему это работает, давайте посмотрим на дерево виджетов:

<MainScreen>: 
    id: scrmain 
    BoxLayout: 
     Label: 
     Label: 
      id: mainlog 
     Button: 
     Button: 

здесь ids являются словарем в MainScreen доступном из MainScreen().ids (экземпляр), и это выход:

{'mainlog': <WeakProxy to <kivy.uix.label.Label object at 0x12345678>>} 

что означает, что вы не можете назначить корневой виджет своего собственного словаря - по крайней мере, не так + не имеет никакого смысла в любом случае, потому что вы можете просто позвонить root, что дает вам экземпляр корневого виджета.

+0

Дорогой KeyWeeUsr, с новым годом и благодарю за четкое разъяснение. Теперь я понимаю :) –