Vue lecture

Kivy : un cadriciel graphique unique en Python

Kivy est un cadriciel (framework) graphique, permettant de développer des interfaces tactiles (ou utilisable à la souris) sur toutes les plateformes, y compris mobiles. Il s'accompagne d'une suite de logiciels très pratiques que nous allons présenter ici.

logo Kivy

Sommaire

Kivy : boîte à outils graphique multi-plateformes

Kivy permet de créer des interfaces graphiques naturellement adaptées aux écrans tactiles (mais qui restent utilisables sur un environnement de bureau traditionnel, à la souris et sans écran tactile). Il est écrit principalement en Python mais les parties critiques sont écrites en Cython, ce qui lui permet d’avoir de bonnes performances.

Une interface Kivy peut s’écrire de deux façons (ou, plus couramment, par une combinaison de ces deux façons) : en Python directement, ou via kv, une syntaxe déclarative dont nous parlons plus bas.

Pour vous donner une idée, voici un exemple de hello world repris du site officiel de Kivy :

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()

Ce qui donnera :
capture d’écran du hello world

Une interface est composée de « widgets » agencés via des « layouts ». Certains widgets permettent de facilement mettre en place des composants communs de nos jours, comme par exemple le widget Carousel :
capture d’un widget Carousel

D’autre part, Kivy fournit des outils qui simplifient la vie du développeur ou de la développeuse, en particulier un système de propriétés (à ne pas confondre avec les propriétés Python) qui permet de mettre automatiquement l’interface à jour quand elles sont modifiées, ou de facilement attacher une fonction de rappel (« callback »), voir plus bas pour un exemple simple. On peut aussi citer un mécanisme d’animations très pratique et efficace.

kv : interface graphique en déclaratif

kv est un langage permettant de décrire des interfaces, il met à profit les propriétés mentionnées plus haut et l’interface va se mettre à jour automatiquement quand des propriétés utilisées dans kv sont modifiées.

Reprenons le hello world vu plus haut, et faisons-le avec kv:

Widget:
    Button:
        text: "Hello World"

Plutôt simple non ?
Le code kv est généralement mis dans des fichiers séparés avec l’extension .kv.

Les propriétés

Kivy a donc un concept de propriété, qui permettent la liaison de données bidirectionnelles (two-way data binding), ou en d’autres termes de facilement avoir l’état mis à jour entre le code python et l’interface décrite dans le fichier kv. C’est à l’usage très pratique et facile.

Un exemple va sans doute aider à comprendre.

Commençons par faire un environnement virtuel Python avec Kivy:

$ mkdir demo

$ cd demo

$ python -m venv env

$ source env/bin/activate

$ pip install kivy

Ensuite créez le fichier demo.py suivant :

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty

class CompteurWidget(BoxLayout):
    compteur = NumericProperty(0)

    def increment(self):
        self.compteur += 1

class DemoApp(App):
    def build(self):
        return CompteurWidget()

DemoApp().run()

Et maintenant, dans le même répertoire, ajoutez le fichier demo.kv suivant, ce dernier sera automatiquement découvert par Kivy parce qu’il s’appelle comme notre application (DemoApp) sans le suffixe App et en minuscule :


<CompteurWidget>:
    orientation: 'vertical'
    padding: 20

    Label:
        text: str(root.compteur)
        font_size: 30

    Button:
        text: "Incrémenter"
        on_press: root.increment()

Il ne nous reste plus qu’à lancer le programme :

python demo.py

Et à admirer :

capture d’écran du programme de démo

Le label se met automatiquement à jour quand le compteur compteur est incrémenté.

La lectrice ou le lecteur assidu de DLFP pourra faire un TapTempo en exercice.

Note: Ne vous arrêtez pas au fait que l’UI est un peu "moche" par défaut, il y a des extensions beaucoup plus attractives (cf. KivyMD plus bas), et il est très facile de personnaliser l’interface et d’en faire une très belle en modifiant un peu ses fichiers .kv.

Plyer : accéder facilement aux fonctionnalités matérielles de votre appareil

Plyer est une bibliothèque permettant d’accéder à nombre de fonctions utiles de manière indépendante de la plateforme. Ainsi vous avez une API commune pour afficher une notification, demander l’état de la batterie, faire vibrer l’appareil, faire de la synthèse vocale de texte (« text-to-speech »), ouvrir un fichier avec le dialogue natif de la plateforme, etc.

Bien que développé par la même équipe que Kivy, ce paquet est utilisable indépendamment et est donc particulièrement utile pour n’importe quel projet multi-plateformes. Référez-vous à la page du projet pour avoir un tableau des fonctionnalités supportées selon les plateformes, et à la documentation pour plus de détails.

Python For Android : utiliser Python… sur Android

Si vous souhaitez distribuer votre application sur Android, vous allez devoir avoir une version de Python compilée pour cette plateforme, ainsi que de tous les paquets nécessitant une compilation.

C’est le rôle de Python pour Android, qui est une collection d’outils qui s’appuient sur l’Android SDK pour permettre d’utiliser Kivy ou d’autre paquets Python sur Android, et ainsi faire votre propre distribution Python.

Si vous utilisez un paquet qui n’est pas en pur Python (c’est-à-dire qu’il y a des parties à compiler) et qui n’est pas encore disponible ou qui l’est mais dans une version trop ancienne, vous pouvez écrire ou mettre à jour des « recettes » (recipes en anglais) qui indiquent comment compiler. Référez-vous à la documentation pour voir comment faire.

Notez toutefois qu’il y a une pénalité à utiliser du Python par rapport à une application dans un langage compilé : il faut charger l’interprète au démarrage, et au tout premier lancement de votre application (et uniquement au premier) il y a aura une phase de décompression de vos fichiers. En dehors de ces petits inconvénients, ça fonctionne très bien.

Là encore, le projet est indépendant de Kivy et peut être utilisé avec un autre cadriciel.

Kivy for iOS : déployez sur les appareils Apple

À l’instar d’Android, l’équipe de Kivy fournit les outils pour faire votre distribution Python pour iOS.

Il vous faudra posséder une machine Apple pour les utiliser, à cause des restrictions imposées par cette plateforme (ceci n’est pas spécifique à Kivy pour iOS, mais s’applique à tous les outils pour développer sur iOS).

Ainsi avec une seule base de code (et après avoir passé un peu de temps pour configurer correctement les outils de compilation), vous pouvez déployer votre application Kivy/Python sur toutes les plateformes majeures (hormis le web, pour lequel il existe d’autres options comme Brython, Pyodide ou PyScript, mais c’est un sujet pour une autre dépêche).

Pyjnius : utiliser l’API Java Android depuis Python

Parfois l’utilisation de Plyer mentionné plus haut et de la bibliothèque standard Python ne suffisent pas, et vous avez besoin d’accéder à l’API d’Android, mais cette dernière est faite pour être utilisée avec Java ou Kotlin.

Pour pouvoir utiliser l’API d’Android depuis Python, PyJNIus est disponible. Ce paquet permet d’accéder aux classes Java comme à des classes Python en utilisant JNI (« Java Native Interface » ou « Interface Native de Java »).

Ce paquet fournit une méthode autoclass qui convertit automatiquement une classe Java en Python, c’est très facile à utiliser et souvent suffisant pour les cas simples.

KivyMD, des widgets Material Design

KivyMD n’est pas un projet officiel de l’équipe Kivy, mais un projet tiers dédié à la création d’un ensemble de Widgets thémables adoptant Material Design.

Image d’exemple de KivyMD issue de la documentation

L'image ci-dessus est issue de la documentation de KivyMD, vous trouverez également des démos vidéo sur le dépôt du projet.

Quelques limitations

Une petite note sur mon expérience personnelle (Goffi). Kivy est un excellent cadriciel, et l’équipe est accueillante et réactive : c’est un projet que je recommanderais en général. Ceci dit, dans mon cas particulier (un client XMPP ayant de nombreuses fonctionnalités), j’ai quelques limitations qui me poussent actuellement à chercher des alternatives, notamment basées sur Qt (PyQt et PySide) :

  • l’accessibilité est un problème majeur. L’équipe y travaille, mais aujourd’hui les applications Kivy ne sont pas accessibles. C’est notamment dû au fait que l’interface utilisateur est entièrement gérée par Kivy, au lieu d’utiliser des composants natifs, et c’est un point complètement bloquant pour moi.
  • il n’y a pas de webview ou de rendu HTML natif, ce qui est bloquant parce que je fais du rendu de blogs.
  • le rendu de texte est incomplet, notamment sur les plateformes mobiles. C’est compliqué de faire un rendu riche avec des émojis, par exemple, un gros problème pour une application de messagerie de nos jours.
  • le support des portails Freedesktop est inexistant : il faut faire l’implémentation à la main, alors qu’il est natif sur des cadriciels majeurs comme GTK ou Qt. Je pense par exemple à l’ouverture ou l’enregistrement de fichier. Les portails sont particulièrement nécessaires si on veut voir son application sur Flatpak. Plus de détails sur ce ticket.
  • le support Wayland existe, mais lors de mes tests sur des distributions GNU/Linux sur Pinephone, il n’a pas fonctionné et je n’ai pas pu afficher l’application.
  • le chargement de l’interprète Python prend un certain temps, ce qui rend le lancement de l’application sur plateformes mobiles telle qu’Android et probablement iOS (que je n’ai pas testé) un peu lent. Sachant que sur ces plateformes l’application peut être tuée à n’importe quel moment auquel cas il faut tout relancer, cela peut mener à une mauvaise expérience utilisateur. Ceci dit, avec une distribution optimisée (en enlevant les paquets non utilisés), et sur les téléphones actuels qui sont très puissants, le problème est sans doute moindre.

Notez que je n’ai pas eu l’occasion de travailler avec Kivy récemment, peut-être que ces remarques ne sont plus à jour. Merci d’indiquer en commentaires s’il y a eu de l’évolution sur ces points.

Aussi, mon cas d’utilisation est très demandant (rendu HTML, affichage de texte performant, etc). Dans la plupart des cas, Kivy remplit sans problème toutes les cases (sauf l’accessibilité, qui reste son problème le plus important à mon sens).

Conclusion

Comme vous pouvez le voir, un travail considérable a été effectué sur Kivy et son écosystème, et il en sort un cadriciel performant, pratique, et qui peut potentiellement fonctionner sur la plupart des plateformes. Kivy est agréable à utiliser, et dispose d’une communauté très active et disponible.

Ce cadriciel mérite de s’y attarder, et est une option sérieuse si vous voulez développer un projet rapidement pour une ou plusieurs plateformes.

Une note d’histoire

Cette dépêche a été commencée le 04 octobre 2018 à 14:19 (au premier jour de la Pycon FR 2018, à Lille, où une partie de l’équipe de Kivy était présente). Je crois que c’est haut la main la dépêche qui est restée le plus longtemps dans l’espace de rédaction. Comme quoi, tout vient à point à qui sait attendre, comme dirait l’autre.

Merci à toutes les personnes qui ont participé à la correction de la dépêche.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •  

PyConFR 2025, à Lyon du 30 octobre au 2 novembre

L’Association Francophone Python (AFPy) organise la PyConFR 2025 du jeudi 30 octobre au dimanche 2 novembre. Pour cette 16e édition, nous sommes accueillis par le Campus René Cassin de Lyon !

Logo de la PyConFR 2025

La PyConFR, c’est un évènement gratuit sur 4 jours autour du langage de programmation Python. Elle est composée deux jours de développements participatifs (sprints), puis de deux jours de conférences et ateliers.

L’appel à propositions est ouvert jusqu’au 20 juillet. Peu importe votre niveau en Python, vous pouvez proposer un sujet de sprint, de conférence ou d’atelier ! Venez parler de développement logiciel, de diversité, de communauté, faire un retour d’expérience sur un outil, présenter votre projet, un domaine d’activité…

Comme tous les ans, nous proposons aux personnes habituellement peu représentées en conférence de l’aide pour trouver un sujet, rédiger la proposition de conférence, rédiger le support de conférence et pour répéter. Vous pouvez nous contacter à l’adresse diversite@afpy.org si vous pensez en avoir besoin.

Enfin, la PyConFR est entièrement financée par les sponsors. Si vous connaissez des sponsors potentiels, n’hésitez pas à leur parler de l’évènement !

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •  

Gestion simple de tournois sportif PyTournois

Sportifs du dimanche, on a souvent besoin de gérer des tournois très simples du type « tout le monde rencontre tout le monde » avec quelques contraintes:

  • nombre de terrains limité ;
  • temps d’attente minimal entre deux matchs ;
  • règles variées sur la gestion des scores.

Depuis une vingtaine d’années, je développe différents sites en Python/Django. Du coup j’ai fabriqué un début de site :).

Code

Libriste depuis toujours, le code du projet est sous licence GPL. Actuellement très simple, le site permet de gérer uniquement le mode « toutes les équipes se rencontrent ». Plus tard, suivant les retours, les utilisations et mon temps libre, j’ajouterai d’autres modes (par exemple pour gérer des groupes de placements).

Pour éviter les calculs inutiles, l’affectation des rencontres utilise des grilles de placement. Ces grilles sont calculées une fois pour toutes et contenues dans le projet. L’avantage est d’être efficace et rapide sur la génération de toutes les rencontres. L’inconvénient est que seules quelques combinaisons sont actuellement disponibles :)

Fonctionnement

Le fonctionnement est très simple, le principe de base est que toutes les informations sont visibles sans connexion. Il y a quatre grands rôles utilisateurs:

  • administrateur: sert surtout pour créer des comptes utilisateurs ;
  • organisateur: peut créer des équipes et réinitialiser un tournoi ;
  • arbitre: peut enregistrer/modifier les résultats des matchs ;
  • anonyme: accès à la liste des matchs et au classement.

Les règles de classement sont affichées. On peut également définir un message d’accueil. Si on veut sauvegarder les résultats d’un tournoi, il y a un export au format CSV.

Démonstration

Il y a évidemment un site de démonstration du projet. Le lien se trouve ci-dessous. Les ressources nécessaires pour faire tourner le site sont extrêmement limitées. Si les fonctionnalités du site vous conviennent et que vous voulez l’utiliser pour un club/tournois, n’hésitez pas à me contacter. Je pourrais mettre en ligne une version dédiée gratuitement.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •  

Release 2.8.3 of fpdf2 - Release Output Intents, shading patterns, strikethrough text and many more · py-pdf/fpdf2 · GitHub

Added


Permalink
  •  

MicroPython : LCD3310 avec Raspberry-Pi Pico (PCD8544)

Bonjour à tous,

L'écran du célèbre Nokia3310 est bien connu par Maker. Ses 84 * 48px  permettent
Nous lui avions déjà consacré un article en juillet 2020.
C'est aussi l'occasion de sortir le Pico-2-Explorer qui ne quitte décidément plus le bureau.

LCD3310 (PCD8544) sous MicroPython et Pico-2-Explorer
 

Cette fois, nous avons eu l'occasion d'avoir une dalle brute avec son ruban 8 contacts.
Ce fût l'occasion de documenter la nappe et tester cet écran avec un Raspberry-Pi Pico. Après plus de 4 ans, la bibliothèque fonctionne toujours comme un charme.

Source: esp8266-upy/modlcd3310

Tester l'écran se fait très facilement

import time
from machine import SPI, Pin
from lcd3310 import LCD3310

# Pico - create the bus & Pins
ssel = Pin( Pin.board.GP9, Pin.OUT, value=True ) # Not selected by default
lcd_reset = Pin( Pin.board.GP13, Pin.OUT, value=True ) # Not selected by default
lcd_data  = Pin( Pin.board.GP12, Pin.OUT, value=True ) # Data/Command (Data by default)
spi = SPI( 1, miso=Pin.board.GP8, mosi=Pin.board.GP11, sck=Pin.board.GP10 ) 

lcd = LCD3310( spi, ssel, lcd_reset, lcd_data )
print( "contrast: %s" % lcd.contrast )
# See all Framebuffer Method for more information
# https://docs.micropython.org/en/latest/library/framebuf.html
#
lcd.fill( 1 ) # Light-up all points
lcd.text( "Hello", 0,0,0 ) # text, x,y, color=0=transparent
lcd.update()
time.sleep( 3 )

lcd.clear()
lcd.text( "MCHobby<3", 3, 12 )
lcd.text( "Micro-", 3, 12+10 )
lcd.text( "   Python", 3, 12+10+10 )
lcd.rect(0,0,83,47,1)
lcd.update()

lcd.contrast = 110 # 0..127

Tutoriel

Pour en savoir plus, n'hésitez pas à consulter le tutoriel disponibles dans le dépôt esp8266-upy/modlcd3310 .

Où acheter

  • Pico-2-Explorer - plateforme d'apprentissage @ MCHobby
  • MOD-LCD3310 (PCD8544) - écran Nokia 3310 84x48 pixels @ MCHobby
  • MOD-LCD3310 (PCD8544) - écran Nokia 3310 84x48 pixels @ Olimex
  •  

     

     

    •  

    GitHub - christophengelmayer/websiteToWord: Script to convert a website to a single word document

    Il s'agit d'un ensemble d'outils et de scripts conçus pour simplifier le processus de conversion des pages web en un seul document Microsoft Word. Cet utilitaire est particulièrement utile pour l'archivage, l'analyse de contenu ou la lecture hors ligne. Le processus consiste à générer un plan du site, à extraire le contenu, à le convertir au format Markdown, puis à transformer le fichier Markdown en un document Word avec des ressources optionnelles intégrées.


    Permalien
    •  

    Git WithMe - Pour une collaboration Git P2P chiffrée sans serveur ni GitHub

    Alors comme ça, vous êtes encore un projet top secret qui va changer la face du monde et vous voulez le partager avec votre meilleur pote sans que la NSA, Mark Zuckerberg ou votre ex sociopathe puissent y jeter un œil ? Ou peut-être que vous en avez juste marre de créer un nouveau repo GitHub chaque fois que vous voulez rapidement coder à quatre mains sur un truc qui ne vivra pas plus longtemps que la probité d’un homme politique ?

    •  

    Bibliothèque RoboEyes pour MicroPython

    Bonjour à tous,

    Il arrive de temps à autre que l'on tombe sur une petite perle du net.

    A propos de RoboEyes

    Il y a quelques mois, j'ai découvert RoboEyes pour Arduino (de FluxGarage.com).

    Credit: RobotEye par FluxGarage.com

     dont il est possible de voir les caractéristiques sur cette vidéo et cette autre vidéo.

     

     

    Je suis instantanément tombé sous le charme... <3 

    RoboEyes pour MicroPython

    Comme je suis plutôt MicroPython qu'Arduino, j'ai voulu faire un portage sous MicroPython pour pouvoir jouer avec cette magnifique bibliothèque.

    Voila qui est fait! La bibliothèque micropython-roboeyes est maintenant publiée sur GitHub. 

    Brancher un écran est très facile... surtout si c'est écran OLED I2C:

    Et le résultat est plutôt convaincant comme en témoigne la vidéo ci-dessous:


    Pour, au final, un code assez facile à appréhender:

    from machine import I2C, Pin
    from roboeyes import *
    import ssd1306
    
    i2c = I2C( 1, sda=Pin.board.GP6, scl=Pin.board.GP7 )
    lcd = ssd1306.SSD1306_I2C( 128, 64, i2c, addr=0x3d )
    
    def robo_show( roboeyes ):
    	global lcd
    	lcd.show()
    
    # Plug RoboEyes on any FrameBuffer descendant
    robo = RoboEyes( lcd, 128, 64, frame_rate=100, on_show = robo_show )
    robo.set_auto_blinker( ON, 3, 2) 
    robo.set_idle_mode( ON, 2, 2) 
    
    while True:
    	robo.update()  # update eyes drawings 

    La bibliothèque offre de nombreuses possibilités de création géométrique pour les yeux (voyez l'exemple test_basic.py).


    Les fonctionnalités sont également détaillées dans les exemples et la documentation de l'API RoboEyes vous permettra de rapidement prendre le contrôle des yeux.

    Avantages apportés par MicroPython

    Le FrameBuffer

    Comme l'implémentation est basée sur le FrameBuffer de MicroPython, tous les écran dérivant de FrameBuffer peuvent être utilisés avec RoboEyes.

    Autrement dit, la majorité des afficheurs graphiques sous MicroPython fonctionneront :-) 

    Portabilité

    RoboEyes est Platform Agnostic, il fonctionnera donc sur toutes les plateformes MicroPython. La seule vrai dépendance est le FrameBuffer de MicroPython.

    Envie d'en savoir plus?

    •  

    Quelques sites web que j'ai conçu

    Au cours des 18 derniers mois, j'ai eu l'occasion de concevoir plusieurs sites web pour des proches et des associations où je suis bénévole.

    Dans cet article, je reviens sur mes choix de solutions pour les mettre en place, et partage mes réflexions concernant les alternatives pour concevoir de "petits …


    Permalink
    •  

    Pico-2-Explorer : découverte et exploration de l'électronique avec MicroPython

    Bonjour à tous,

    Je vous présente le projet Pico-2-Explorer, petit nouveau au catalogue MC Hobby.

    Pico-2-Explorer : Raspberry Pico 2 sous MicroPython

    Le Pico-2-Explorer, c'est un mini-laboratoire visant a simplifier la prise en main de de la programmation sous MicroPython (Python pour Microcontroleur) avec des raccordements simplifiés.
    L'usage de Thonny IDE est également un élément clé pour réaliser ses premiers pas sans stress.

    Raccordements simplifiés

    Un seul fil est nécessaire pour utiliser l'un des composants disponibles sur le Pico-2-Explorer.

    Ces raccordements simplifiés permettent de démarrer rapidement la partie programmation sans trop se prendre la tête.

    Source: Pico-2-Explorer wiki (montage simplifié)

    Cela n'empêche pas de disposer d'une version détaillée des raccordements dans les différents tutos.

    Source: Pico-2-Explorer wiki (montage détaillé)

    Des tutoriels pour le peuple

    Bien entendu, on ne vous lâche pas avec la carte sans vous épauler.
    Le Pico-2-Explorer dispose d'une série de tutoriels de prise en main et d'utilisation de différents composants.

    Ces tutoriels reprennent l'information nécessaire à la compréhension des composants utilisés, de quoi débuter en douceur avec Thonny IDE.

    Les tutoriels du Pico-2-Explorer

    Une meilleure lisibilité

    Un problème récurrent dans le prototypage, c'est les problèmes de Parallaxe.

    Avoir les libellés sur la carte et un connecteur rehaussé d'un centimètre peut-être source d'erreur de branchement. En effet, il est très facile de se brancher sur la broche d'à côté sans s'en rendre compte. C'est d'autant plus vrai que le connecteur est long (ex: 20 broches comme sur le Pico).

    Pour éviter cette source de confusion, les libellés des broches sont rehaussés juste à côté du connecteur. C'est vraiment très confortable a l'usage!


    Composants à usage multiples

    En plus d'apprendre, Pico-2-Explorer propose des composants à usage multiple.
    Disposer de bouton et LEDs pré-raccordés sous la main sera quasi indispensable lors de vos propres explorations (c'est du vécu)

    Détail du Pico-2-Explorer

    Un potentiomètre saura aussi se montrer fort utile pour fixer rapidement une consigne (ou tester des composants analogiques).
    L'usage du buzzer reste bien entendu à discrétion de l'utilisateur, les bibliothèques sont déjà disponibles sur la carte. 

    Connecteur Qwiic/StemmaQt

    Le bus I2C est un incontournable dans le monde de l'électronique. Nous avons prévus un connecteur Qwiic (chez SparkFun) également appelé StemmaQT (chez Adafruit). 

    Celui-ci permet de brancher rapidement des capteurs et extension.

    Connecteur Qwiic/StemmaQt sur le Pico-2-Explorer

    Comme vous pouvez le constater, ce dernier se trouve juste sous sa documentation (qui servira d'aide mémoire). 

    Il est prévu l'écriture d'un tutoriel exploitant cette connectique. Dans l'attente, notre dépôt esp8266-upy contient de nombreux pilotes pour du matériel I2C.

    Documenter vos projets

    Le dépôt pico-2-explorer contient la ressource pico-2-explorer-drawing.png en haute résolution.

    Dégainez votre logiciel de dessin favori et dessinez vos propres raccordement.

    ressource pico-2-explorer-drawing.png (en haute résolution)

    Plus d'information

    Pour plus d'information, je vous invite à la consultation de la fiche produit du Pico-2-Explorer.


    •