2016-12-31 2 views
0

Ich versuche ein Feld zu aktualisieren, das auf einem anderen Bildschirm existiert, aber nicht erfolgreich ist. Ich wäre sehr sehr erfreut, wenn mir jemand sagen könnte, was ich hier falsch mache. Wie Objekte in anderen Bildschirmen mit dem kivy screenmanager referenziert werden

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

Antwort

1

Sie versuchen ids Wörterbuch zugreifen zu können, das ist schön, aber in einem ganz anderen Beispiel, das ist, warum diese Fehler:

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

Sie müssen auf die richtige Instanz zugreifen, um auf ihre Eigenschaften zugreifen zu können. In diesem Fall müssen Sie auf die ScreenManager zugreifen, um auf ihre screens Eigenschaft (eine Liste von Instanzen) zuzugreifen, von der aus Sie die gewünschten Bearbeitungen vornehmen können zum Beispiel Text:

MainScreen.action1():

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

Um zu verstehen, warum es so aussehen Lassen sie sich auf dem Widget-Baum arbeitet:

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

hier die ids sind ein Wörterbuch in MainScreen zugänglich von MainScreen().ids (eine Instanz), und dies ist die Ausgabe:

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

, das bedeutet, dass Sie nicht wirklich die Wurzel-Widget zu einem eigenen Wörterbuch zuweisen können - zumindest nicht auf diese Weise + macht sowieso keinen Sinn, denn Sie können einfach root aufrufen, wodurch Sie die Instanz des Root-Widgets erhalten.

+0

Sehr geehrte KeyWeeUsr, Frohes neues Jahr und vielen Dank für die klare Klärung. Jetzt verstehe ich :) –

Verwandte Themen