Kivy et le ScreenManager

Les sources des exemples sont disponibles ici.

Le principe

Kivy ne travaille qu’avec une seule fenêtre. Dans celle-ci, on peut mettre un ou plusieurs composants “Screen”.

On peut ainsi en mettre plusieurs les uns après les uns pour remplir la fenêtre, à la manière des “Layout”.

Mais on peut surtout les mettre les uns à la place des autres. Pour celà, on utilise un ou plusieurs composants “ScreenManager”.

Ainsi, le contenu d’un “ScreenManager” est une succession de “Screen” dont les noms devront être définie par l’attribut “name” (à ne pas confondre avec “id”).

L’attribut “current” du “ScreenManager” indique le nom du composant “Screen” courant. Il suffit donc de changer sa valeur pour basculer d’un écran à l’autre.

Un exemple basique : on basculer entre deux écrans ( Exemple04 )

– Builder.py

On y définit deux classes “Screen1” et “Screen2”, et la méthode “vers-ecran()” pour faire la bascule.

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

class Screen1(Screen) :
	pass

class Screen2(Screen) :
	pass


class MonAppli(MDApp):
	title = "Mon appli"
	#icon = "Images/icon.png" 

	def build(self):
		self.theme_cls.theme_style = "Light"
		self.theme_cls.primary_palette = "Teal"

		return Builder.load_file("design.kv")


	def vers_ecran(self,ecran):
		self.root.ids.screen_manager.current = ecran
		if ecran=="ecran1":
			self.root.ids.screen_manager.transition.direction = "right"	
		else :
			self.root.ids.screen_manager.transition.direction = "left"	


if __name__ == '__main__':
	MonAppli().run()
– design.kv

On commence par définir les deux écrans, avant les placer dans le ScreenManager.

Ne pas oublier de placer le ScreenManager dans un Screen.

<Screen1> :
	name : "ecran1"

	MDBoxLayout :
		orientation : "vertical"
		padding : 20
		spacing : 20

		MDLabel : 
			text: "Écran 1"
			halign : "center"
			font_style : "H6"
			md_bg_color : (1,1,0,0.5)
			size_hint_y : 0.5
		MDFloatLayout :
			MDRaisedButton :
				text : "Aller sur Écran 2"
				pos_hint : {"center_x" : 0.5,"center_y" : 0.5}
				on_release : app.vers_ecran("ecran2")

<Screen2> :
	name : "ecran2"

	MDBoxLayout :
		orientation : "vertical"
		padding : 20
		spacing : 20

		MDLabel : 
			text: "Écran 2"
			halign : "center"
			font_style : "H6"
			md_bg_color : (0,1,1,0.5)
			size_hint_y : 0.5
		MDFloatLayout :
			MDRaisedButton :
				text : "Aller sur Écran 1"
				pos_hint : {"center_x" : 0.5,"center_y" : 0.5}
				on_release : app.vers_ecran("ecran1")

Screen : 
	ScreenManager:
		id: screen_manager

		Screen1 :

		Screen2 :

Un exemple plus complet : utilisation de MDNavigationLayout et de MDNavigationDrawer

Cet exemple peut servir de base pour un vrai projet.

Les deux fichiers principaux sont encore builder.py et design.kv.