Ceci est une ancienne révision du document !
Table des matières
Kivy: Comment faire un tas de chose
Comment chercher ?
Sur internet
- Dans la doc officielle, mais les chances de trouver sont quasi nulles.
- Dans un moteur de recherche: ça finit souvent par des posts sur stackoverflow, avec des réponses
médiocresfausses, uniquement motivées par le gain de points !
Une bonne solution: Les exemples des sources de kivy
Des explications avec les exemples des sources
Une liste de scripts qui explique bien:
- pos_hint : boxlayout_poshint.py
- bubble : bubble_test.py
- camera : camera.py
- carousel : carousel_buttons.py
- mipmap : label_mipmap.py
- text_size = textwrap : label_text_size.py
- text with markup : label_with_markup.py
- popup : popup_with_kv.py
- scatter : scatter.py et scatter.kv
- scrollview : scrollview.py et scrollview.kv
- splitter : splitter.py
- tabbed panel = onglet : tabbedpanel.py
- text align : textalign.py textalign.kv
- video player : videoplayer.py
- ErrorPopup(Popup) : main.py et text2speechdemo.kv
- Slider : circle.py
- Clock : Pong ou mesh_manipulation.py
Adapter la résolution dpi sur son PC
- Sur votre PC, définir la taille de votre fenêtre
from kivy.core.window import Window # Les 3 lignes ci-dessous sont à commenter pour buildozer # L'écran de mon tél fait 1280*720 k = 1.0 WS = (int(1280*k), int(720*k)) Window.size = WS
Lancer le main.py avec:
KIVY_METRICS_FONTSCALE=1.2 python3 main.py
avec une valeur “1.2” à adapter pour que vous ayez le même graphisme sur votre PC que sur votre téléphone.
Comment lister tous les widgets dans le python
Par exemple, extrait de smartcitizen main.py#L83:
# Recherche de tous les widgets de self print([type(widget) for widget in self.walk(loopback=True)]) # Recherche de tous les widgets de Screen1 print(self.ids.sm) f = self.ids.sm.get_screen("first") print([type(widget) for widget in f.walk(loopback=True)])
Sortie de [type(widget) for widget in self.walk(loopback=True)] dans SmartCitizen()
<class '__main__.SmartCitizen'>, <class 'kivy.uix.actionbar.ActionBar'>, <class 'kivy.uix.actionbar.ActionView'>, <class 'kivy.uix.actionbar.ActionButton'>, <class 'kivy.uix.image.Image'>, <class 'kivy.uix.screenmanager.ScreenManager'>, <class '__main__.MainScreen'>, <class 'kivy.uix.boxlayout.BoxLayout'>, <class 'kivy.uix.label.Label'>, <class 'kivy.uix.boxlayout.BoxLayout'>, ......
Comment passer d'une class à une autre
En fait, comment passer d'un objet à un autre !
Faire des print(de quoi ?). Commencer par
print(dir(self))
puis dans la liste des méthodes et attributs, ayez de nez. Si app est dans la liste:
print(dir(self.app))
Pourquoi définir les attributs appelés dans *.kv comme attributs de classe ?
Parce que c'est comme ça ? Quand lama fâché, lui toujours faire ainsi !
Voir l'exemple ci-dessous.
Comment changer la couleur d'un Rectangle ?
Répond aussi à la Question:
Comment définir et accéder aux attributs dans le main et le *.kv ?
Les attributs des widgets défini dans le *.kv sont accessibles depuis le main, seulement si les attributs du widget sont définis en attribut de classe.
Exemple extrait de multipong:
*.kv
<PongPaddle>: canvas: Color: rgb: self.rect_color Rectangle: pos: self.pos size: root.height/65, root.height/7 <Screen1>: ... ... paddle_0: paddle0 ... ... PongPaddle: # paddle_0 id: paddle0 pos: self.pos ... ... BoxLayout: orientation: 'horizontal' BoxLayout: size_hint_x: 0.70 canvas: Color: rgba: 1, 1, 1, 1 Line: points: [int(x*(root.top/720)) for x in root.points] joint: 'miter' width: 3 close: 1
extrait de main.py
... ... class PongPaddle(Widget): rect_color = ListProperty([1, 1, 1]) angle = NumericProperty(0) ... ... class Screen1(Screen): ... ... def apply_paddle_red_color(self, my_num): if my_num == 0: self.paddle_0.rect_color = 1, 0, 0 ... ...
Button background_color
Button: background_normal: '' background_color: 1, .3, .4, .85
Texte en gras dans un label
Label: canvas.before: Color: rgba: 1, 1, 1, 1 Rectangle: pos: self.pos size: self.size size_hint_y: 0.10 markup: True text: '[b]' + "Mon texte" + '[/b]' color: 1, 0, 0.5, 1
Factory
Factory peut être utilisée pour enregistrer automatiquement toute classe ou module et en instancier des classes n'importe où dans votre projet.
- API Factory using-factory-objects-in-kivy I'm not sure of everything the Factory is used for … Les exemples de la doc qui l'utilisent sont irréels ….
Réception sur Android en Multicast
Dans buildozer.spec, définir:
android.permissions = INTERNET,CHANGE_WIFI_MULTICAST_STATE,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE
Twisted dans kivy
- Integrating with other Frameworks propose l'intégration des 2 !
- Exemple avec Apprendre Kivy