(Mise à jour : 26/04/2014)
Quand j’ai un peu de temps, j’aime bien jouer au programmeur et me confronter à la création de logiciels. Je suis ainsi assez satisfait d’Asobou !, entièrement programmé en VB.net, mais depuis que j’ai un portable sous Mac OS, je suis confronté à la problématique du multi-plateforme…
J’ai donc repris Asobou ! depuis le début, en Java (et une nouvelle version ne devrait pas tarder). En cherchant le langage avec lequel développer la version multi-plateforme d’Asobou !, j’ai un peu joué avec Python, qui s’avère facile à utiliser et très adapté au multi-plateforme. Tant et si bien que je vous propose aujourd’hui un lanceur de fichiers assez basique, mais qui remplit parfaitement sa fonction, j’ai nommé Simple Lanceur (on appréciera l’originalité du titre).
Simple Lanceur se présente sous la forme d’un script affichant une liste à partir de laquelle s’affichent des fiches de présentation très simples et depuis laquelle on peut lancer n’importe quel fichier, en utilisant le programme par défaut de l’OS.
Windows :
Mac OS :
Linux (ici Ubuntu) :
Simple Lanceur n’utilise que la bibliothèque Python standard, y compris pour la GUI (TKinter inside). Si Python est installé sur l’ordinateur de l’utilisateur, Simple Lanceur devrait fonctionner sans difficulté. Comment savoir si Python est installé ? Très simple : depuis la console Windows ou le terminal Mac OS / Linux, il suffit de taper « python » et de valider : si vous obtenez un résultat comparable à ceux présentés ci-après, c’est tout bon. Sinon, un petit tour sur le site officiel de Python permettra de résoudre le problème.
Windows :
Mac OS :Linux (ici Ubuntu) :
Le fonctionnement de Simple Lanceur est basique :
– Placé dans un dossier, il va afficher dans la liste le nom de tous les sous-dossiers (les utilisateurs de Linux remplaceront tous les « dossier » de cet article par « répertoire »…).
– Dans chaque sous-dossier – logiquement listé – il va chercher une image d’illustration nommée « jaquette.gif » qui sera placée en image principale, et trois images nommées « 001.gif », « 002.gif » et « 003.gif » qui seront placées en pied de page.
– En cliquant sur le bouton « REGARDER », le fichier placé dans le sous-dossier visualisé et nommé « film.film » est lancé avec le programme configuré pour lancer les fichiers « .film ».
– Et c’est tout ! Notez que j’ai développé Simple Lanceur pour disposer d’un lanceur léger et basique pour mes divx, mais qu’il peut servir à lancer n’importe quel fichier : si vous voulez lancer un mp3 par exemple, il suffit de modifier le script pour que le fichier à lancer s’appelle « mp3.mp3 » (par exemple)…
Le script est simple et du coup assez limité : je vous propose ci-après une FAQ fictive (dans le sens ou personne n’a posé de question :D) permettant d’éluder la plupart des petits problèmes.
Si Simple Lanceur vous intéresse, n’hésitez pas à télécharger l’archive contenant le script et un dossier exemple : Simple Lanceur (Utilisateur : Acces_ftp, mot de passe JeVeuxCharger).
Mise à Jour 26/4/2014 : J’ai corrigé le script, qui ne fonctionnait pas sous Windows, le fichier à lancer n’étant pas localisé.
En pratique, j’ai remplacé la ligne
fichierALancer = titreSelectionne + "/" + var_film
par
fichierALancer = repertoire_courant + "/" + titreSelectionne + "/" + var_film
Le script est donc vraiment multi-plateformes !
Sinon, j’insère également le script lui-même, qu’il vous suffit de coller tel quel dans un fichier texte brut dont l’extension sera « .py ».
Code HTML :
[ Montrer le script ]
[ Cacher le script ]# -*-coding:utf-8 -*
# Simple Lanceur
# Un lanceur basique de videos
# Octobre 2013 - Bob Dupneu
# www.bobdupneu.fr
# Redistribution gratuite et modification autorisees en citant l'auteur
# DOCUMENTATION en ligne : http://www.bobdupneu.fr/2013/11/10/simple-lanceur-un-lanceur-multimedia-en-python############################
# VARIABLES MODIFIABLES #
#############################Variables pour le nom des fichiers
var_im_prin = ("jaquette.gif")
var_ap_1 = ("001.gif")
var_ap_2 = ("002.gif")
var_ap_3 = ("003.gif")
var_film = ("film.film")#Variables pour stocker et modifier les couleurs
couleur_1 = "light grey"
couleur_2 = "light grey"
couleur_3 = "white"
couleur_4 = "blue"#Variable pour le texte du bouton
texte_bouton = "REGARDER"##########################################################################
try:
try:
from tkinter import *
except:
from Tkinter import *
except:
raise ImportError(‘Wrapper Tk non disponible’)
import os
import subprocess
import sys#Variables diverses#Police de caractere pour les titres
police_titres = (‘arial’, 16, ‘bold’, ‘italic’)#Variable pour le titre de l’objet
titre_objet = (« »)#Variables pour les chemins des images
chemin_image_principale = (« »)
chemin_image_apercu_1 = (« »)
chemin_image_apercu_2 = (« »)
chemin_image_apercu_3 = (« »)
#Variable pour le fichier à lancer
fichierALancer = (« »)
#WVariable pour la taille des pads
taille_pad_x = 10
taille_pad_y = 10
###################
#FENETRE PRINCIPALE
###################
fenetre = Tk()
fenetre.title(« Simple lanceur »)
fenetre.resizable(width=False, height=False)
conteneur_principal = Frame(fenetre)
conteneur_principal.pack()
#Conteneur de gauche, pour la liste
conteneur_gauche = Frame(fenetre, bg=couleur_1)
conteneur_gauche.pack(side=LEFT, fill=Y)
#Conteneur de droite
conteneur_droite = Frame(fenetre, bg=couleur_2)
conteneur_droite.pack(side=RIGHT, fill=BOTH, expand=1)
#Conteneur droite haut, pour le titre et la jaquette
conteneur_droite_h = Frame(conteneur_droite, bg=couleur_2)
conteneur_droite_h.pack(side=TOP, fill=BOTH)
#Conteneur droite bas, pour les apercus
conteneur_droite_b = Frame(conteneur_droite, bg=couleur_2)
conteneur_droite_b.pack(fill=BOTH)
#ELEMENTS DE LA FENETRE PRINCIPALE#
#PARTIE DE GAUCHE
#Titre « Liste » (en haut)
titre_liste = Label(conteneur_gauche, text= »Liste », fg=couleur_4, bg=couleur_1, font=police_titres)
titre_liste.pack()
#Liste (au milieu)
#ListBox
liste = Listbox(conteneur_gauche, bg=couleur_3)
liste.pack(fill=Y, expand=1)
#Bouton de lancement (en bas)
bouton_lancement = Button(conteneur_gauche, text=texte_bouton, padx=taille_pad_x)
bouton_lancement.pack(side=BOTTOM, fill=X)
#PARTIE CENTRALE
#Titre de l’objet (en haut)
l_titre_objet = Label(conteneur_droite_h, text=titre_objet, fg=couleur_4, bg=couleur_2, font=police_titres)
l_titre_objet.pack(side=TOP)
#Image principale (au milieu)
try :
image_principale = PhotoImage (file=chemin_image_principale)
label_image_principale = Label(conteneur_droite_h, image=image_principale, height=375, width=500, bg=couleur_2)
label_image_principale.image = image_principale
label_image_principale.pack(side=BOTTOM)
except :
image_principale = PhotoImage ()
label_image_principale = Label(conteneur_droite_h, height=375, width=500, bg=couleur_2)
label_image_principale.image = image_principale
label_image_principale.pack(side=BOTTOM)
#Trois apercus (en dessous)
try :
image_apercu_1 = PhotoImage (file=chemin_image_apercu_1)
label_image_apercu_1 = Label(conteneur_droite_b, image=image_apercu_1, height=150, width=200, bg=couleur_2)
label_image_apercu_1.image = image_apercu_1
label_image_apercu_1.pack(side=LEFT, padx=taille_pad_x, pady=taille_pad_y)
except :
image_apercu_1 = PhotoImage ()
label_image_apercu_1 = Label(conteneur_droite_b, image=image_apercu_1, height=150, width=200, bg=couleur_2)
label_image_apercu_1.image = image_apercu_1
label_image_apercu_1.pack(side=LEFT, padx=taille_pad_x, pady=taille_pad_y)
try :
image_apercu_2 = PhotoImage (file=chemin_image_apercu_2)
label_image_apercu_2 = Label(conteneur_droite_b, image=image_apercu_2, height=150, width=200, bg=couleur_2)
label_image_apercu_2.image = image_apercu_2
label_image_apercu_2.pack(side=LEFT, padx=taille_pad_x, pady=taille_pad_y)
except :
image_apercu_2 = PhotoImage ()
label_image_apercu_2 = Label(conteneur_droite_b, image=image_apercu_2, height=150, width=200, bg=couleur_2)
label_image_apercu_2.image = image_apercu_2
label_image_apercu_2.pack(side=LEFT, padx=taille_pad_x, pady=taille_pad_y)
try :
image_apercu_3 = PhotoImage (file=chemin_image_apercu_3)
label_image_apercu_3 = Label(conteneur_droite_b, image=image_apercu_3, height=150, width=200, bg=couleur_2)
label_image_apercu_3.image = image_apercu_3
label_image_apercu_3.pack(side=LEFT, padx=taille_pad_x, pady=taille_pad_y)
except :
image_apercu_3 = PhotoImage ()
label_image_apercu_3 = Label(conteneur_droite_b, image=image_apercu_3, height=150, width=200, bg=couleur_2)
label_image_apercu_3.image = image_apercu_3
label_image_apercu_3.pack(side=LEFT, padx=taille_pad_x, pady=taille_pad_y)
############
#ALGORITHMES
############
#CREATION DE LA LISTE
#Recherche de tous les noms de dossiers dans le repertoire courant
repertoire_courant = os.path.dirname(os.path.realpath(__file__))
liste_dossier = []
for f in os.listdir(repertoire_courant) :
if os.path.isdir(f) :
premiere_lettre = f[:1]
if premiere_lettre != « . » :
liste_dossier.append(f)
#Remplissage de la ListBox avec la liste des dossiers
for item in sorted(liste_dossier, key=str.lower) :
liste.insert(END, item)
#REMPLISSAGE DE LA FICHE EN FONCTION DES DONNEES DE LA FICHE SELECTIONNEE
#Fonction qui modifie l’affichage de la fiche
def selectionChange(self):
titreSelectionne = liste.get(liste.curselection())
titre_objet = titreSelectionne
l_titre_objet.config(text=titre_objet)
l_titre_objet.update()
chemin_image_principale = titreSelectionne + « / » + var_im_prin
image_principale = PhotoImage (file=chemin_image_principale)
label_image_principale.config(image=image_principale)
label_image_principale.image = image_principale
label_image_principale.update()
chemin_image_apercu_1 = titreSelectionne + « / » + var_ap_1
image_apercu_1 = PhotoImage (file=chemin_image_apercu_1)
label_image_apercu_1.config(image=image_apercu_1)
label_image_apercu_1.image = image_apercu_1
label_image_apercu_1.update()
chemin_image_apercu_2 = titreSelectionne + « / » + var_ap_2
image_apercu_2 = PhotoImage (file=chemin_image_apercu_2)
label_image_apercu_2.config(image=image_apercu_2)
label_image_apercu_2.image = image_apercu_2
label_image_apercu_2.update()
chemin_image_apercu_3 = titreSelectionne + « / » + var_ap_3
image_apercu_3 = PhotoImage (file=chemin_image_apercu_3)
label_image_apercu_3.config(image=image_apercu_3)
label_image_apercu_3.image = image_apercu_3
label_image_apercu_3.update()
global fichierALancer
fichierALancer = repertoire_courant + « / » + titreSelectionne + « / » + var_film
#On surveille un changement de selection dans la liste pour lancer la fonction precedente
liste.bind(‘<<ListboxSelect>>’, selectionChange)
#LANCEMENT DU FICHIER AVEC LE PROGRAMME PAR DÉFAUT
#Fonction largement inspirée de http://sametmax.com/ouvrir-un-fichier-avec-le-bon-programme-en-python/
def lancerFichier(path):
# Vérifier que le fichier existe
if not os.path.exists(path):
raise IOError(‘Fichier inexistant: %s’ % path)
# On a acces en lecture ?
if hasattr(os, ‘access’) and not os.access(path, os.R_OK):
raise IOError(‘Fichier inaccessible: %s’ % path)
# Lancer le bon programme pour le bon OS :
if hasattr(os, ‘startfile’): # Windows
# Startfile est très limité sous Windows, on ne pourra pas savoir
# si il y a eu une erreur
proc = os.startfile(path)
elif sys.platform.startswith(‘linux’): # Linux:
proc = subprocess.Popen([‘xdg-open’, path],
# on capture stdin et out pour rendre le
# tout non bloquant
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
elif sys.platform == ‘darwin’: # Mac:
proc = subprocess.Popen([‘open’, ‘–‘, path],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
raise NotImplementedError(
» `%s` n’est pas un systeme supporte`. » % sys.platform)
# Proc sera toujours None sous Windows. Sous les autres OS, il permet de
# récupérer le status code du programme, and lire / ecrire sur stdin et out
return proc
try :
bouton_lancement.config(command= lambda: lancerFichier(fichierALancer))
except :
print(0)
fenetre.mainloop()
Voilà, n’hésitez pas à me faire part de vos remarques ou suggestions !
Bob Dupneu
P.S. : Le code utilisé pour afficher/masquer le script a été trouvé ici.
SIMPLE LANCEUR – FAQ
1 – Le nom des fichiers contenu dans le dossier est-il important ?
Oui, mais les premières lignes du script proposent de modifier ces noms. Attention : sous Mac OS et Linux, 001.gif et 001.GIF ne sont pas la même chose.
2 – Je veux utiliser Simple Lanceur pour lancer des films et des fichiers word. Est-ce possible ?
Tout à fait, mais pas dans le même dossier. Il faut un dossier contenant un script de Simple Lanceur qui va chercher des fichiers film. film, et un autre contenant un script de Simple Lanceur modifié pour aller chercher des fichiers doc.doc (par exemple).
3 – La fiche est visible, mais il ne se passe rien lorsque je clique sur le bouton.
Les quatre images (l’image principale et les trois images d’illustration) ne doivent pas être présentes dans le dossier. Il faut compléter le dossier avec les images blanches contenues dans le dossier « exemple » de l’archive téléchargeable, car si le script ne trouve pas les quatre images, il ne plante pas mais ne lance pas le fichier, pour une raison que je n’ai pas encore identifiée.
4 – J’ai placé mes images dans le dossier, mais elles ne s’affichent pas.
TKinter, utilisé pour la GUI, se limite à l’affichage des images GIF et PGM/PPM. Vérifiez que vos images sont bien dans un de ces formats, et au besoin convertissez-les avec un logiciel de traitement d’images, comme The Gimp ou XnView.
Vérifiez également que le nom des images correspond bien à ce que recherche le script, et rappelez-vous que sous Mac OS et Linux, la casse est importante (vois question 1)
5 – Le script ne se lance pas, et j’ai le message d’erreur « Wrapper TK non disponible ».
Cela veut dire que TKinter n’est pas installé. Sous Windows et Mac OS, l’erreur ne devrait pas se produire, mais cela arrive sous Linux, qui livre souvent les programmes en pièces détachées. Un « sudo apt-get install python-tk » dans le terminal devrait régler le problème (sous debian-like du moins). Sinon, renseignez-vous sur la façon d’installer TKinter avec votre distribution.
6 – J’ai un autre problème.
Posez votre question dans les commentaires, j’y répondrai et je compléterai cette FAQ.
Bonjour et merci pour ce script,
Mais je ne suis pas très doué, aussi pourrais-tu mettre un script déjà modifié et fonctionnel en démonstration, ce serait plus parlant pour trouver le bon endroit des variable à adapter à la configuration.
Car ton script s’ouvre nickel mais je ne peux rien en faire j’ai beau essayer de mettre des chemins, des noms de fichiers, et tout bloque ou me fait une fenètre sans fin que je doit tuer.
Merci de ta compréhension.
Bonjour!
Pour le script, la version en téléchargement (ftp://ftp.bobdupneu.fr/SimpleLanceur.zip) est normalement fonctionnelle. Je l’ai testé avec Windows, Mac Os et Ubuntu. Quelle version de Python utilises-tu?