2017-12-12 40 views
0

私は次のようにkivy(KV)には非常に簡単な例をやろうとしています:Kivy - のKv - ScreenManagerの - 現在の画面を変更

#:import Toolbar kivymd.toolbar.Toolbar 

BoxLayout: 
    orientation: 'vertical' 
    Toolbar: 
     id: toolbar 
     title: 'My Toolbar' 
     md_bg_color: app.theme_cls.primary_color 
     background_palette: 'Primary' 
     background_hue: '500' 
     left_action_items: [['arrow-left', app.root.ids.scr_mngr.current = 'screen1' ]] 
     right_action_items: [['arrow-right', app.root.ids.scr_mngr.current = 'screen2' ]] 
    ScreenManager: 
     id: scr_mngr 
     Screen: 
      name: 'screen1' 
      Toolbar: 
       title: "Screen 1" 
     Screen: 
      name: 'screen2' 
      Toolbar: 
       title: "Screen 2" 

left_action_itemsとright_action_items両方がペアのリストを期待するので、これは失敗しますが:[name_of_icon、expression]。

left_action_items: [['arrow-left', lambda x: app.root.ids.scr_mngr.current = 'screen1' ]] 
:一方

on_release: 
    app.root.ids.scr_mngr.current = 'screen1' 

、left_action_itemための適切なアプローチのようなものになります:あなたは、ボタンを扱うとき一方、声明は、私たちが何かをすれば、インスタンスのための法的だろう

しかし、これはpythonの下でlambdaのようなassigmentを実行することはできませんので、法的ではありません。

left_action_itemsが画面を変更するための正しいアプローチは何でしょうか?

答えて

0

rootクラスをpythonクラスにして、そこにchange_screenメソッドを持たせることができます。また、スクリーン・マネージャをルート・クラスのObjectPropertyにします。
次に、引数をメソッドに渡すには、kvでpartialを使用します。
このようにしてみてください。

from kivy.app import App 
from kivy.lang import Builder 
from kivy.properties import ObjectProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivymd.theming import ThemeManager 

class MyLayout(BoxLayout): 

    scr_mngr = ObjectProperty(None) 

    def change_screen(self, screen, *args): 
     self.scr_mngr.current = screen 


KV = """ 
#:import Toolbar kivymd.toolbar.Toolbar 
#:import partial functools.partial 

MyLayout: 
    scr_mngr: scr_mngr 
    orientation: 'vertical' 
    Toolbar: 
     id: toolbar 
     title: 'My Toolbar' 
     left_action_items: [['arrow-left', partial(root.change_screen, 'screen1') ]] 
     right_action_items: [['arrow-right', partial(root.change_screen, 'screen2') ]] 
    ScreenManager: 
     id: scr_mngr 
     Screen: 
      name: 'screen1' 
      Toolbar: 
       title: "Screen 1" 
     Screen: 
      name: 'screen2' 
      Toolbar: 
       title: "Screen 2" 
""" 


class MyApp(App): 
    theme_cls = ThemeManager() 

    def build(self): 
     return Builder.load_string(KV) 


MyApp().run() 
+0

それは動作します。 ScreenManagerが次のようなことをする可能性を与えないのは残念です:set_screen( 'screen1') – mantielero

+0

@mantieleroはあなたの質問に答えませんか? – EL3PHANTEN

0

複数のオプションを使用すると、

left_action_items: [('arrow-left', (app.root.ids.scr_mngr, 'current', 'screen1'))] 

を行うと、後で行うことができます、あります

for icon, expr in self.left_action_items: 
    setattr(*expr) 

あなたは本当にあなたが行うことができます実行可能な表現をしたい場合:

left_action_items: [('arrow-left', lambda: setattr(app.root.ids.scr_mngr, 'current' 'screen1'))] 
関連する問題