Outils pour utilisateurs

Outils du site


issue62:tutopython

This time, we’ll finish up using SL4A. We’ll make a larger program and then send it to the virtual machine via ADB. Let’s deal with our code first. In this, we’ll simply be trying out some of the “widgets” that are available to us when using SL4A. Start on your desktop using your favorite editor. Enter the code shown top right and save it (but don’t try to run it) as “atest.py”. The first line imports the android library. We create an instance of it in the second line. Line 3 creates and displays a dialog box with the title “Hello”, the prompt of “What’s your name?”, a text box for the user to enter their name, and two buttons, “OK” and “Cancel”. Once the user presses “OK”, the response is returned in the variable uname. The last line (so far) then says “Hello {username} from python on Android!”. This isn’t new, we did this before. Now we’ll add more code (above).

Cette fois-ci, nous allons en terminer avec l'utilisation de SL4A. Nous allons faire un programme plus important, puis l'envoyer à la machine virtuelle via ABD.

Occupons-nous d'abord de notre code. Pour cela, nous allons simplement essayer quelques-uns des « widgets » qui sont à notre disposition lorsqu'on utilise SL4A. Démarrez sur votre bureau à l'aide de votre éditeur de texte favori.

Entrez le code que vous voyez en haut à droite et sauvegardez-le (mais n'essayez pas de l'exécuter) en tant que « atest.py ».

La première ligne importe la bibliothèque android. Nous en créons une instance dans la deuxième ligne. La ligne 3 crée et affiche une boîte de dialogue avec le titre « Bonjour », l'invite « Quel est votre nom ? », une zone de texte pour que l'utilisateur saisisse son nom, et deux boutons, « OK » et « Annuler ». Une fois que l'utilisateur appuie sur « OK », la réponse est renvoyée dans la variable nomutilisateur. La dernière ligne (pour l'instant) affiche alors : « Bonjour {nom} depuis Python sur Android ! ». Ce n'est pas nouveau, nous l'avons fait la dernière fois. Maintenant, nous allons ajouter plus de code (ci-dessus).

Save your code as atest1.py. We’ll be sending this to our virtual machine after we discuss what it does. Take a look at the first four lines we just entered. We create an alert type dialog asking “Would you like to play a game?”. In the case of an alert type dialog, there’s no text box to enter anything. The next two lines say to create two buttons, one with the text “Yes”, which is a “positive” button, and one with the text “No”, a “negative” button. The positive and negative buttons refer to the response returned - either “positive” or “negative”. The next line then shows the dialog. The next seven lines wait for a response from the user. We create a simple loop (while True:) then wait for a response for up to 10 seconds by using the droid.eventWait(value) call. The response (either “positive” or “negative”) will be returned in - you guessed it - the response variable. If response has the name of “dialog”, then we will break out of the loop and return the response. If nothing happens before the timeout occurs, we simply break out of the loop. The actual information returned in the response variable is something like this (assuming the “positive” or “Yes” button is pressed)… {u’data’: {u’which’: u’positive’}, u’name’: u’dialog’, u’time’: 1339021661398000.0}

Enregistrez votre code sous « atest1.py ». Nous allons envoyer cela à notre machine virtuelle après avoir discuté de ce qu'il fait.

Jetez un coup d'œil aux quatre premières lignes que nous venons de saisir. Nous créons une boîte de dialogue d'alerte demandant « Voulez-vous jouer à un jeu ? ». Dans le cas d'une boîte de dialogue d'alerte, il n'y a pas de zone de texte pour saisir quoi que ce soit. Les deux lignes suivantes permettent de créer deux boutons, l'un avec le texte « Oui », qui est un bouton « positif », et l'autre avec le texte « Non », un bouton « négatif ». Les boutons positifs et négatifs se réfèrent à la réponse retournée - positive ou négative. La ligne suivante affiche alors la boîte de dialogue. Les sept lignes suivantes attendent une réponse de l'utilisateur.

Nous créons une simple boucle (while True:), puis attendons une réponse pendant 10 secondes en utilisant la fonction droid.eventWait(valeur). La réponse (soit positive soit négative) sera retournée dans - vous l'aurez deviné - la variable reponse. Si cette variable contient « dialog », nous sortons de la boucle et retournons la réponse. Si rien ne se passe avant que le délai soit dépassé, nous sortons simplement de la boucle. L'information réelle retournée dans la variable réponse ressemble à ceci (en supposant qu'on ait choisi le bouton positif, soit « Oui ») :

{u’data’: {u’which’: u’positive’}, u’name’: u’dialog’, u’time’: 1339021661398000.0}

You can see that the value is passed in the ‘data’ dictionary, the dialog key is in the ‘name’ dictionary, and there is a ‘time’ value that we don’t care about here. Finally we dismiss the dialog box. Before we can send our code to the virtual machine, we have to start the virtual machine. Start your Android emulator. Once it starts up, notice that the title bar has four digits at the start of the title. This is the port that the machine is listening on. In my case (and probably yours) it’s 5554. Now, let’s push it to our virtual machine. Open a terminal window and change to the folder you saved the code in. Assuming you have set your path to include the SDK, type adb devices

Vous pouvez voir que la valeur est passée dans le tableau « data », le texte « dialog » dans le tableau « name » et il y a une valeur « time » dont nous ne nous soucions pas ici.

Enfin, nous fermons la boîte de dialogue.

Avant que nous puissions envoyer notre code à la machine virtuelle, il faut la faire démarrer. Exécutez votre émulateur Android. Une fois qu'il a démarré, vous remarquerez que la barre de titre contient quatre chiffres au début du titre. Il s'agit du port sur lequel la machine est à l'écoute. Dans mon cas (et probablement dans le vôtre) il s'agit de 5554.

Maintenant, nous allons envoyer le code vers notre machine virtuelle. Ouvrez une fenêtre de terminal et allez dans le dossier où vous avez enregistré le code. En supposant que vous avez configuré votre chemin par défaut pour y inclure le SDK, saisissez :

adb devices

This asks adb to show any devices that are connected. This can include not only the Android emulator but also any smartphones, tablets, or other Android devices. You should see something like this… List of devices attached emulator-5554 device Now that we are sure that our device is attached, we want to push the application to the device. The syntax is… adb push source_filename destination_path_and_filename So, in my case it would be… adb push atest1.py /sdcard/sl4a/scripts/atest1.py

Ceci demande à adb de montrer tous les périphériques qui sont connectés. Cela peut inclure non seulement l'émulateur Android, mais aussi les smartphones, tablettes ou autres appareils Android. Vous devriez voir quelque chose comme ceci :

Liste des périphériques connectés emulator-5554 device

Maintenant que nous sommes sûrs que notre appareil est connecté, nous voulons envoyer l'application sur le périphérique. La syntaxe est la suivante :

adb push fichier_source chemin_et_fichier_destination

Donc, dans mon cas, ce serait :

adb push atest1.py /sdcard/sl4a/scripts/atest1.py

If everything works correctly, you’ll get a rather disappointing message similar to this… 11 KB/s (570 bytes in 0.046s) Now, on the Android emulator, start SL4A. You should see all of the python scripts, and, in there you should see atest1.py. Tap (click) on ‘atest1.py’, and you’ll see a popup dialog with 6 icons. From left to right, they are “Run in a dialog window”, “Run outside of a window”, “Edit”, “Save”, “Delete”, and “Open in an external editor”. Right now, tap (click) on the far left icon “Run in a dialog window” so you can see what happens. You’ll see the first dialog asking for your name. Enter something in the box and tap (click) the ‘Ok’ button. You’ll see the hello message. Next, you’ll see the alert dialog. Tap (click) on either button to dismiss the dialog. We aren’t looking at the responses yet so it doesn’t matter which one you choose. Now we’ll add some more code (top right).

Si tout fonctionne correctement, vous obtiendrez un message plutôt décevant semblable à ceci :

11 Ko/s (570 octets en 0.046s)

Maintenant, sur l'émulateur Android, démarrez SL4A. Vous devriez voir tous les scripts python et, parmi eux, vous devriez voir atest1.py. Tapez (cliquez) sur « atest1.py » et vous verrez une boîte de dialogue avec 6 icônes. De gauche à droite, on trouve « Exécuter dans une fenêtre de dialogue », « Exécuter en dehors d'une fenêtre », « Éditer », « Enregistrer », « Supprimer », et « Ouvrir dans un éditeur externe ». Pour le moment, tapez (cliquez) sur l'icône la plus à gauche « Exécuter dans une fenêtre de dialogue » afin que vous puissiez voir ce qui se passe.

Vous verrez la première boîte de dialogue vous demandant votre nom. Entrez quelque chose dans la boîte et tapez (cliquez) sur le bouton « Ok ». Vous verrez le message bonjour. Ensuite, vous verrez la boîte de dialogue d'alerte. Tapez (cliquez) sur l'un des boutons pour fermer la boîte de dialogue. Nous ne regardons pas les réponses pour l'instant alors peu importe celle que vous choisissez. Maintenant, nous allons ajouter un peu plus de code (en haut à droite).

I’m sure you can figure out that this set of code simply checks the response, and, if it’s ‘None’ due to a timeout, we simply print “Timed out.” And, if it’s actually something we want, then we assign the data to the variable rdialog. Now add the next bit of code (below)… This part of the code will look at the data passed back by the button-press event. We check to see if the response has a “which” key, and, if so, it’s a legitimate button press for us. We then check to see if the result is a “positive” (‘Ok’ button) response. If so, we’ll create another alert dialog, but this time, we will add a list of items for the user to choose from. In this case, we offer the user to select from a list including Checkers, Chess, Hangman, and Thermal Nuclear War, and we assign the values 0 to 3 to each item. (Is this starting to seem familiar? Yes, it’s from a movie.) We then display the dialog and wait for a response. The part of the response we are interested in is in the form of a dictionary. Assuming the user tapped (clicked) on Chess, the resulting response comes back like this… Result(id=12, result={u’item’:1}, error=None)

Je suis sûr que vous comprendrez que ce morceau de code vérifie simplement la réponse et, si c'est « Aucune » à cause du temps d'attente, nous affichons simplement « Trop tard ». Et si c'est effectivement quelque chose que nous voulons, alors nous assignons les données à la variable rdialog. Maintenant, ajoutez le bout de code suivant (ci-dessous) :

Ce morceau de code regardera les données transmises par l'événement d'appui sur un bouton. Nous vérifions si la réponse a une valeur « which » et, si c'est le cas, c'est bien un appui légitime sur un bouton. Nous vérifions ensuite si le résultat est la réponse « positive » (bouton « OK »). Si c'est le cas, nous créons une autre boîte de dialogue d'alerte, mais cette fois nous allons ajouter une liste d'éléments parmi lesquels l'utilisateur choisira. Dans ce cas, nous proposons à l'utilisateur de choisir parmi une liste comprenant Dames, Échecs, Pendu et Guerre nucléaire et nous attribuons les valeurs 0 à 3 pour chaque élément. (Est-ce que cela commence à paraître familier ? Oui, ça vient d'un film.) Nous affichons ensuite la boîte de dialogue et attendons une réponse. La partie de la réponse qui nous intéresse est sous la forme d'un tableau. En supposant que l'utilisateur tape (clique) sur Échecs, la réponse résultante nous revient comme ça :

Result(id=12, result={u’item’:1}, error=None)

In this case, we are really interested in the result portion of the returned data. The selection is #1 and is held in the ‘item’ key. Here’s the next part of the code (above right)… Here we check to see if the response has the key “item”, and, if so, assign it to the variable “sel”. Now we use an if/elif/else loop to check the values and deal with whichever is selected. We use the droid.makeToast function to display our response. Of course, you could add your own code here. Now for the last of the code (bottom right)… As you can see, we simply respond to the other types of button-presses here. Save, push, and run the program.

Dans ce cas, nous sommes vraiment intéressés par la partie « result » des données renvoyées. La sélection est le n° 1 et est contenue dans la clé « item ». Voici la partie suivante du code (en haut à droite) :

Ici, nous vérifions pour voir si la réponse contient la clé « item » et, si c'est le cas, nous l'affectons à la variable « sel ». Ensuite nous utilisons une boucle if/elif/else pour vérifier les valeurs et traiter celle qui est sélectionnée. Nous utilisons la fonction droid.makeToast pour afficher notre réponse. Bien sûr, vous pourriez ajouter votre propre code ici. Maintenant, voici la dernière partie du code (en bas à droite).

Comme vous pouvez le voir, nous répondons simplement aux autres appuis de boutons ici.

Sauvegardez, envoyez, puis exécutez le programme.

As you can see, SL4A gives you the ability to make “GUIfied” applications, but not full gui apps. This however, should not keep you from going forward and starting to write your own programs for Android. Don’t expect to put these up on the “market”. Most people really want full GUI type apps. We’ll look at that next time. For more information on using SL4A, simply do a web search and you’ll find lots of tutorials and more information. By the way, you can push directly to your smartphone or tablet in the same way. As usual, the code has been put up on pastebin at http://pastebin.com/REkFYcSU See you next time.

Comme vous pouvez le voir, SL4A vous donne la possibilité de faire des applications « graphiques », mais pas complètement. Cela ne devrait toutefois pas vous empêcher d'aller de l'avant et de commencer à écrire vos propres programmes pour Android. Ne vous attendez pas à les mettre sur le « marché ». La plupart des gens veulent vraiment des applications complètement graphiques. Nous verrons cela la prochaine fois. Pour plus d'informations sur l'utilisation de SL4A, il suffit de faire une recherche sur Internet et vous trouverez beaucoup de tutoriels et d'autres informations.

Au fait, vous pouvez envoyer votre code directement sur votre smartphone ou votre tablette de la même manière.

Comme d'habitude, le code a été mis en place sur pastebin à http://pastebin.com/BHJWqjCf

Rendez-vous la prochaine fois.

issue62/tutopython.txt · Dernière modification : 2012/08/30 15:28 de auntiee