2017-03-05 17 views
0

別のクラスのボタンからスクリーンマネージャを制御しようとしていますが、ボタンon_press:のステートメントで何を設定するのか分かりません。Python Kivyスクリーンマネージャwigetスコープ

Kivy Python Nav

Kivyファイル:

<HeaderSection>: 
    anchor_x: 'center' 
    anchor_y: 'top' 
    BoxLayout: 
     orientation: 'horizontal' 
     size_hint: 1, .1 
     id: header 
     Label: 
      text: 'My App' 

<ContentSection>: 
    anchor_x: 'center' 
    anchor_y: 'center' 
    ScreenManager: 
     size_hint: 1, .8 
     Screen: 
      name: 'home' 
      Label: 
       text: 'First screen' 
     Screen: 
      name: 'second' 
      Label: 
       text: 'Second screen' 
     Screen: 
      name: 'third' 
      Label: 
       text: 'Third screen' 

<FooterSection>: 
    anchor_x: 'center' 
    anchor_y: 'bottom' 
    BoxLayout: 
     orientation: 'horizontal' 
     size_hint: 1, .1 
     Button: 
      text: 'first' 
      on_press: root.ContentSection.manager.current = 'first' 
     Button: 
      text: 'second' 
      on_press: root.current = 'second' 
     Button: 
      text: 'third' 
      on_press: ContentSection.ScreenManager.current = 'third' 

Pythonのファイル:

from kivy.app import App 
from kivy.lang import Builder 
Builder.load_file('MyApp.kv') 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.label import Label 
from kivy.uix.image import Image 

# Declare sections 
class HeaderSection(AnchorLayout): 
    pass 

class ContentSection(AnchorLayout): 
    def build(self): 

     # Create the screen manager 
     sm = ScreenManager() 
     sm.add_widget(FirstScreen(name='first')) 
     sm.add_widget(SecondScreen(name='second')) 
     sm.add_widget(ThirdScreen(name='third')) 
     return sm 

class FooterSection(AnchorLayout): 
    pass 


class MyAppApp(App): 
    def build(self): 

     #Create the sections 

     fl = FloatLayout() 
     hs = HeaderSection() 
     cs = ContentSection() 
     fs = FooterSection() 

     fl.add_widget(hs) 
     fl.add_widget(cs) 
     fl.add_widget(fs) 
     return fl 


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

私はさまざまな方法を試してみました:

on_press: root.parent.ContentSection.ScreenManager.current = 'home' 
on_press: root.parent.ContentSection.manager.current = 'home' 
on_press: root.ContentSection.manager.current = 'home' 

それがSであるように私は感じます

AttributeError: 'FooterSection' object has no attribute 'ContentSection' 

だから私のアプリは、次の階層があります:

FloatLayout 
    HeaderSection 
    ContentSection 
     ScreenManager 
      FirstScreen 
      SecondScreen 
      ThirdScreen 
    FooterSection 
     Button for FirstScreen 
     Button for SecondScreen 
     Button for ThirdScreen 

だから私は画面にアクセスするContentSectionにドリルダウンし、その後、FloatLayoutにレベルをアップトラバースする必要がある問題を対処、エラーがのようなものを言いますマネージャー。

答えて

1

ウィジェットツリーのナビゲートは私にとっては苦労しています.AFAIKでは、ウィジェットツリーをあなたが望むようにトラバースすることはできません。

ただし、ウィジェットツリーを単純化し、すべてが同じルートを共有し、IDを使用できることを確認してください。ここで

は(私もKV言語にすべてを移動)私はそれをやった方法は次のとおりです。

KV

FloatLayout: 
    AnchorLayout: 
     anchor_x: 'center' 
     anchor_y: 'top' 
     Label: 
      size_hint: 1, .1 
      text: 'My App' 
    AnchorLayout: 
     anchor_x: 'center' 
     anchor_y: 'center' 
     ScreenManager: 
      id: manager 
      size_hint: 1, .8 
      Screen: 
       name: 'first' 
       Label: 
        text: 'First screen' 
      Screen: 
       name: 'second' 
       Label: 
        text: 'Second screen' 
      Screen: 
       name: 'third' 
       Label: 
        text: 'Third screen' 
    AnchorLayout: 
     anchor_x: 'center' 
     anchor_y: 'bottom' 
     BoxLayout: 
      orientation: 'horizontal' 
      size_hint: 1, .1 
      Button: 
       text: 'first' 
       on_press: root.ids.manager.current = 'first' 
      Button: 
       text: 'second' 
       on_press: root.ids.manager.current = 'second' 
      Button: 
       text: 'third' 
       on_press: root.ids.manager.current = 'third' 

パイソン

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.label import Label 
from kivy.uix.image import Image 



class MyAppApp(App): 
    def build(self): 
     return Builder.load_file('MyApp.kv') 


if __name__ == '__main__': 
    MyAppApp().run() 
+0

これは動作しますが、私は同様の方法は、前に働いたがすべてしていました私のkivyコードは私のpythonファイルにありました。質問:なぜ 'root.ids.manager'ですか?'ids 'は何を表していますか? –

+0

'.ids'は、ルートウィジェットがそのIDを格納する場所です。 – ebuenger

関連する問題