Python pour android : Kivy (installations et exemples)

(actualisé le ) par wlaidet

Introduction

Le site : http://kivy.org/#home

Kivy permet de développer en Python des applications, des jeux, sur toutes plateformes (Win, Linux, Mac, iOS, Android...).

Si vous voulez créer votre application pour Android (création d’un fichier apk), il sera préférable d’utiliser Linux et d’installer Buildozer. (Voir plus loin dans cette page.)

De même, pour iOS, il faudra utiliser (pour packager l’application) un Mac etc...

Mais quoi qu’il arrive, vous applications pourront être développées sur tous les OS.

(Attention aux spécificités des chemins vers les fichiers et autres...)

Il faut penser à adapter ses applications pour tablettes et autres smartphones.

Voici un exemple et une façon d’utiliser Kivy sur Win7 (Peut-être plus à jour...) :

Installation sous W7, W8, W10

Pour télécharger Kivy. Vous trouverez la doc ici :
http://kivy.org/#download

Il existe des versions portables de Kivy (Python + Kivy) dans un dossier à extraire. Aujourd’hui (mai 2016) il faut installer Python avant d’installer Kivy. Voici les étapes d’après la doc en ligne :

Installer Python :

Si vous avez déjà Pyzo et Miniconda, vous pouvez passer cette étape.
Sinon, vous pouvez installer Pyzo et Miniconda ou une version nue de Python 3.6 : https://www.python.org/downloads/windows/

Installation de Kivy :

Dans un terminal si vous avez la version nue de Python (Tapez cmd dans la recherche d’applications Windows) ou dans le shell de Pyzo (en enlevant à chaque fois "python -m" des lignes de commandes suivantes ) :

  • Allez dans le dossier où se trouve votre installation Python (C :\Python3.6) :
cd C:\Python3.6
  • Vous pouvez vérifier votre installation Python :
python --version
  • Installez pip et Wheel :
python -m pip install --upgrade pip wheel setuptools
  • Installez des dépendences :
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew

(Gstreamer est assez lourd donc ne l’installez que si vous en avec besoin (cf doc kivy))

Pour python 3.5 seulement, vous aurez besoin d’une librairie complémentaire :

python -m pip install kivy.deps.angle
  • Installez Kivy :
python -m pip install kivy

Vous devez maintenant avoir Kivy. Pour tester :

  • Ouvrez un éditeur (Notepad, Pyzo...)
  • Copier/coller le code suivant :
import kivy
kivy.require('1.0.6') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):

    def build(self):
        return Label(text='Hello world')

if __name__ == '__main__':
    MyApp().run()

Télécharger

  • Enregistrez sous main.py
  • Clique droit sur le fichier, "Ouvrir avec", "Python Launcher" :
Screenshot Windows Kivy
  • Votre première application devrait se lancer :
Hello World Kivy

Si vous souhaitez packager vos applications pour Windows et WindowsPhones, je vous laisse lire la doc :

http://kivy.org/docs/guide/packaging-windows.html

Installation sous Linux Ubuntu14.04 et Mint17

Kivy existe dans les dépots. Il s’agit de la version 1.7. (Actuellement, la version 1.9 est sortie.)

Kivy pour python 2.7 : (Peut-être aussi 3.4 mais je n’ai pas testé...)

Dans un terminal tapez :

sudo apt-get install python-kivy

C’est la version que nous utiliserons au collège.

Si vous voulez une version plus récente :

Dans un terminal :

sudo add-apt-repository ppa:kivy-team/kivy
sudo apt-get update
sudo apt-get install python-kivy

Télécharger

Pour exécuter un programme, allez dans le dossier où se trouve votre programme nom_du_fichier.py puis, tapez :

python {nom_du_fichier.py}

Kivy sur Android

Deux méthodes :

Vous pourrez alors transférer vos fichiers ".py" sur votre appareil et les lancer. Cette méthode peut servir à tester rapidement des programmes simples sur Android. L’ouverture de certains droits spécifiques sera impossible.

  • Créer une application pour Android (apk) :
    Installer buildozer ou bien télécharger une iso Linux toute prête puis l’installer avec une VirtualBox :

La doc sur l’image Linux pour Kivy : http://kivy.org/docs/guide/packaging-android-vm.html#kivy-android-vm

Installation de buildozer :

Attention ! Les dernières versions du SDK Android ne sont plus supportées par Linux 32 bits.
Lors de la première création d’un apk, buildozer va télécharger la dernière version du SDK. Vous aurez un message d’erreur. Il faudra alors downgrader votre SDK. Une méthode ici : http://stackoverflow.com/questions/9555337/how-to-downgrade-my-sdk-version. un lien vers le SDK dans cette discussion : http://stackoverflow.com/questions/34216342/android-studio-adb-syntax-error-unexpected.

Pour l’installation :

Vous avez de bonnes explications ici : http://wiki.labomedia.org/index.php

En gros :

Dans un terminal :

sudo apt-get install python-dev build-essential ccache git openjdk-7-jdk zlib1g-dev python-setuptools libncurses5 libstdc++6 zlib1g unzip
sudo easy_install pip
sudo pip install --upgrade cython==0.21
sudo pip install markupsafe
sudo pip install --upgrade buildozer

Télécharger

Il se peut qu’il vous manque des paquets. Vérifiez :

sudo apt-get install javacc
sudo apt-get install openjdk-7-jdk

Télécharger

Utilisation :

Il faut que vos dossiers contenant les programmes main.py soient dans votre répertoire personnel.

Ouvrez un terminal et allez dans votre dossier où se trouve votre fichier main.py.

Tapez :

buildozer init

Ouvrez avec un éditeur le fichier buildozer.spec :

gedit buildozer.spec

Modifiez le nom, le titre de votre application.

Modifiez la version (Ajoutez un # devant les deux lignes de version en méthode 1 et enlever le # de la version en méthode 2... C’est plus simple ainsi...).

Voici un exemple :
Avant :

# (str) Application versioning (method 1)
version.regex = __version__ = [’"](.*)[’"]
version.filename = %(source.dir)s/main.py
# (str) Application versioning (method 2)
# version = 1.2.0

Après :

# (str) Application versioning (method 1)
#version.regex = __version__ = [’"](.*)[’"]
#version.filename = %(source.dir)s/main.py
# (str) Application versioning (method 2)
version = 1.2.0

Plus bas dans ce fichier, vous avez un "log_level = 1". Passez-le à 2 si vous voulez plus de détails sur les éventuelles erreurs.

Enregistrez ensuite votre fichier.

Pour compiler :

buildozer android debug

Si tout se passe bien, vous aurez un dossier bin dans le dossier de votre application contenant un fichier "....apk"

Transférez ce fichier sur votre tablette puis installez-le. Il faut autoriser les sources inconnues.

Il y a des apk dans cet article un peu plus loin (Utilisez les boutons en haut de la page pour slider..)

Une erreur courante :

https://github.com/kivy/buildozer/issues/146#issuecomment-57061269

(Vérifiez qu’il s’agit bien de la même erreur en poussant le Log_Level à 2 dans le fichier buildozer.spec)

Il arrive aussi qu’il faille désinstaller et réinstaller buildozer. Voir dans cette article :

http://wiki.labomedia.org/index.php

Vous avez des exemples de codes pour Kivy (sans kv) ici :

http://tableauxmaths.fr/spip/spip.php?article135&artpage=2-4#outil_sommaire_4

++++

Premières applications

Le retour du chat

Voici une application qui vous rappellera des souvenirs.

Le résultat de cette application
  • Vous devez d’abord télécharger l’image et le son sur votre ordinateur :
Le chat
Le son du chat
  • Rnommez ces fichiers : kitty.png et meow.ogg.
  • Copiez le code suivant et enregistrez-le dans un fichier (par exemple chat.py).
  • Déplacez l’image et le son dans le même dossier que votre programme (c’est plus simple ainsi).

Lors du premier lancement du programme avec Kivy, un temps sera nécessaire aux chargements du son et de l’image.

Voici le code :

from kivy.app import App
from kivy.core.audio import SoundLoader
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label

class ChatApp(App):

    def build(self):
        #On charge un son pour le chat:
        self.sound = SoundLoader.load('meow.ogg')
        #On cree une disposition pour l'affichage:
        Layout=BoxLayout(orientation='vertical',spacing=20,padding=(200,20))
        #On cree un bouton:
        self.BoutonChat=Button(text='Clique moi!',background_normal="kitty.png")
        self.BoutonChat.bind(on_press=self.miaule)
        #On ajoute le bouton dans l'affichage:
        Layout.add_widget(self.BoutonChat)
       
        #On cree un label:
        self.LabelChat=Label(text='Appuie sur le chat', font_size=20)
        Layout.add_widget(self.LabelChat)
       
        #On renvoie l'affichage:
        return Layout

    def miaule(self,instance):
        if self.sound:
            self.sound.play()

if __name__ == '__main__':
    ChatApp().run()

Télécharger

A toi de jouer :

  1. Essaye de modifier le texte du Label lorsque l’utilisateur clique sur le chat.
  2. Ajoutez d’autres boutons et d’autres labels pour observer la disposition de l’affichage : BoxLayout
  3. Modifie ce code avec d’autres images, d’autres sons, d’autres boutons....

Calcul mental

Voici une application de calcul mental à compléter :

Le code :

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup
import random


class Ecran_du_Jeu(BoxLayout):
    def build(self):
        self.orientation='vertical'
        self.spacing=20
        self.haut()
        self.chiffres()
        self.BoutonValider=Button(text='Valider',size_hint=(0.5,0.15),pos_hint={'right': 0.75},background_color=[0,1,0,1])
        self.BoutonValider.bind(on_press=self.valider)
        self.add_widget(self.BoutonValider)

    def haut(self):
        Layout1=GridLayout(cols=2,size_hint_y=0.2,padding=20)
        calcul='9*5=?'
        self.calcul=Label(text=calcul,font_size=30, color=[1,0,0,1])
        Layout1.add_widget(self.calcul)
        self.reponse=''
        self.champreponse = TextInput(text=self.reponse,font_size=30)
        Layout1.add_widget(self.champreponse)
        self.add_widget(Layout1)

    def chiffres(self):
        Layout2=GridLayout(cols=2,size_hint_y=0.5,spacing=10)
        self.Bouton4=Button(text='4')
        self.Bouton4.bind(on_press=self.nombre)
        Layout2.add_widget(self.Bouton4)
        self.Bouton5=Button(text='5')
        self.Bouton5.bind(on_press=self.nombre)
        Layout2.add_widget(self.Bouton5)
        self.add_widget(Layout2)

    def nombre(self,instance):
        self.reponse+=instance.text
        self.champreponse.text=self.reponse
       
    def valider(self,instance):
        reponse=self.champreponse.text
        if reponse=='45':
            content = Button(text='Gagne!', font_size=50)
            popup = Popup(title='Super!',content=content, size_hint=(0.5,0.5))
            content.bind(on_press=popup.dismiss)
            popup.open()

class CalculApp(App):

    def build(self):
        Jeu1=Ecran_du_Jeu()
        Jeu1.build()
        return Jeu1
if __name__ == '__main__':
    CalculApp().run()

Télécharger

A toi de jouer :

  1. Etudiez ce code et ajoutez des commentaires.
  2. Ajoutez les autres boutons pour les chiffres.
  3. Ajoutez un popup en cas d’échec. (On pourra montrer la bonne réponse.)
  4. Effacez le texte de champreponse après une tentative.
  5. Utilisez les nombres aléatoires pour le calcul et modifier le test de la réponse en fonction.
  6. Créez une variable score et ajoutez un label pour l’afficher.
  7. Changez le calcul après chaque tentative.

Voici le fichier apk correspondant. Bien sur, l’application n’est pas complète... à vous de travailler.

Pour l’installer sur votre téléphone android, il faut autoriser les sources inconnues.

Ce fichier est un zip, il faut l’extraire avant de le coller dans votre téléphone.

Ici, vous trouverez l’application de BenjaminD :

++++

Un jeu du Pong

Déplacer des objets :

Voici un exemple permettant de programmer des déplacements.

  • La raquette se déplace en touchant l’écran
  • Les balles se déplacent seules.

Lisez bien les commentaires pour comprendre.

from kivy.app import App
from kivy.graphics import Line, Color, Rectangle, Ellipse
from kivy.uix.widget import Widget
from kivy.clock import Clock

class Raquette(Widget):
    def __init__(self,canvas):
        self.x=50
        self.y=20
        self.canvas=canvas
        self.size=(100,10)
        #On dessine le rectangle correspondant a la raquette:
        with self.canvas:
           
            Color(1,0,0,0.5)
           
            self.rect=Rectangle(pos=self.pos, size=self.size)
       
        #Si les coordonnees de la raquette changent, on met a jour celles
        #du rectangle correspondant:
        self.bind(pos=self.update_rect)#,size=self.update aussi

    def update_rect(self, *args):
        #On synchronise les coordonnees du widget et du rectangle:
        self.rect.pos = self.pos

class Balle(Widget):
    def __init__(self,canvas,pos_x,pos_y):
        self.dx = 0
        self.dy = -2
        self.pos=(pos_x,pos_y)
        self.canvas=canvas
        self.size=(50,50)
        #On dessine la balle:
        with self.canvas:
           
            Color(0,1,0,0.5)
           
            self.disque=Ellipse(pos=self.pos, size=self.size)
       
        self.bind(pos=self.update_disque)
   
    def update_disque(self, *args):
        self.disque.pos = self.pos
 
    def move(self):
        #On teste si la balle touche le sol:
        if  self.pos[1]<0:
            self.dy=-1*self.dy
        #On recalcule les positions:
        self.pos = (self.dx + self.pos[0],self.dy +self.pos[1])
       
class Jeu(Widget):

    def debut(self):
        #On cree les balles et la raquette:
        self.balle1=Balle(self.canvas,700,400)
        self.balle2=Balle(self.canvas,100,100)
        self.raquette=Raquette(self.canvas)
   
    def update(self, dt):
        #On change les coordonnees des balles:
        self.balle1.move()
        self.balle2.move()

    def on_touch_move(self, touch):
        #Si le joueur touche le bas de l'ecran, on modifie la position
        #de la raquette
        if touch.y < self.height / 3:
            self.raquette.x = touch.x

class MyApp(App):

    def build(self):
        Jeu1=Jeu()
        Jeu1.debut()
        #On appelle Jeu1.update() touts les centiemes de seconde
        Clock.schedule_interval(Jeu1.update, 1.0/100.0)
        return Jeu1

if __name__ == '__main__':
    MyApp().run()

Télécharger

A vous de continuer :

  • Faites rebondir les balles en haut
  • Proposez des trajectoires obliques pour les balles et faites les rebondir aussi sur les côtés (Utilisez dx pour le déplacement horizontal)
  • Faites rebondir les balles sur la raquette (Tous les widgets ont une méthode collide_widget(....))

Voici le fichier apk correspondant. Bien sur, l’application n’est pas complète... à vous de travailler.

Pour l’installer sur votre téléphone android, il faut autoriser les sources inconnues.

Ce fichier est un zip, il faut l’extraire avant de le coller dans votre téléphone.

++++

Jeu du serpent (Snake)

Voici le fichier apk correspondant. Bien sur, l’application n’est pas complète... à vous de travailler.

Pour l’installer sur votre téléphone android, il faut autoriser les sources inconnues.

Ce fichier est un zip, il faut l’extraire avant de le coller dans votre téléphone.