2017-12-12 12 views
0

Ich versuche, ein sehr einfaches Beispiel in Kivy (kv) zu tun, wie folgt:Kivy - Kv - ScreenManager- - Ändern des aktuellen Bildschirm

#: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" 

Dies wird fehlschlagen, da beide left_action_items und right_action_items eine Liste von Paaren erwarten : [Name_des_Icons, Ausdruck]. Auf der anderen Seite, wenn Sie mit den Tasten umgehen, würde die Erklärung zum Beispiel legal sein, wenn wir etwas tun:

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

Auf der anderen Seite, der richtige Ansatz für left_action_item wäre so etwas wie:

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

Aber das ist nicht legal, weil Sie eine solche Zuweisung in Lambda unter Python nicht durchführen können.

Was wäre der richtige Ansatz für left_action_items, um den Bildschirm zu ändern?

Antwort

0

Sie können Ihre Root-Klasse in eine Python-Klasse verwandeln und dort eine change_screen-Methode verwenden. Setzen Sie Ihren Screenmanager auch auf eine ObjectProperty in der Root-Klasse.
Verwenden Sie dann partially in kv, um Argumente an die Methode übergeben zu können.
wie dies versucht:

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

Es funktioniert. Es ist schade, dass ScreenManager nicht die Möglichkeit bietet, etwas zu tun: set_screen ('screen1') – mantielero

+0

@mantielero antwortet das nicht auf Ihre Frage? – EL3PHANTEN

0

Es gibt mehrere Optionen, können Sie

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

tun und später tun:

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

Wenn Sie wirklich einen ausführbaren Ausdruck mögen Sie tun können:

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