python pb passage arguments

python pb passage arguments - Python - Programmation

Marsh Posté le 03-05-2008 à 18:59:39    

Bonjours,
alors voila j'ai réalisé une petite visionneuse d'images en python avec Tkinter, PIL, tkFileDialog et sys. Tout marche impec quand je lance le script, je peux ouvrir des photos et les visionner nikel. Mais je voudrais aller plus loin et faire que quand on fait un <click droit> en ayant selectionné plusieurs images, on puisse ouvrir ces images avec mon logiciel.
 
J'ai donc :
self.picture = sys.argv[1:]
 
et apres tout ce qu'il faut pour ouvrir les images.
 
Cela fonctionne depuis la console quand je lance avec :
 
python Picture_viewer.py foto1.jpg foto2.jpg .....
 
Mais en ouvrant directement depuis l'interface graphique avec une command personnalisée :
 
'/home/.../Picture_viewer.py'
(apres avoir changé le droit d'éxécution du fichier)
 
mes photos s'ouvrent belle et bien mais chacune dans une <<version du script>> ouverte séparement (cf si j'ai ouvert 3 photos => trois fois l'application ouverte, chaque version contenant une des 3 photos :??: ) En fait chaque fichier selectionner represente un argument pour chaque Picture_viewer ouvert.  :(  
 
Et donc je voudrais quee toutes s'ouvrent dans une seule application ...
 
Quelqu'un aurait la solution?
merci d'avance.
 
luffy
 
NB: Vous pouvez retrouver une de mes versions précédentes (assez ancienne^^) a :
http://luffy.luck.free.fr/dokuwiki-r...u.php?id=start

Reply

Marsh Posté le 03-05-2008 à 18:59:39   

Reply

Marsh Posté le 05-05-2008 à 11:51:18    

Tu as l'air de parler de deux applications différentes : ton appli Tkinter pour visionner des images et une autre appli à partir de laquelle tu souhaites pouvoir utiliser la première (si j'ai bien compris ?)
 
Si c'est le cas,  on dirait que la deuxième appli prend chacun des photos que tu as sélectionné et passe chaque photo une à une à ton script, au lieu de les passer toutes d'un coup.
Dans ce cas, tu peux pas y faire grand chose, à part vérifier dans ta visionneuse qu'une instance de cectte visionneuse n'est pas lancée, et ouvrir la photo dans cette visionneuse déjà lancée le cas échéant (mais c'est un peu chiant à faire ...) [:spamafote]

Reply

Marsh Posté le 05-05-2008 à 19:04:36    

En fait nan je n'ai qu'un seul programme (je me suis assez mal exprimé^^), "la visionneuse d'images"
En fait:
Depuis le mode console, si je passe des arguments au programme :
 
 python Visio_image.py foto1.gif foto2.gif foto3.gif ......
 
tout marche très bien et mes photos s'ouvrent bien "a la suite" dans ma visionneuse d'images
 
mais depuis le mode graphique, quand je selectionne plusieurs photos, et que je fais "ouvrir avec "  : ma visionneuse d'image, chaque image s'ouvre dans une instance de mon application différente, i.e, si j'ai selectionné 4 photos, 4 instance s'ouvrirons contenant chacune une photo.
 
En fait on dirait que chaque photo selectionné sert d'unique argument a une instance de mon application.
 
Y aurait t'il moyen de faire comprendre que tous les fichiers selectionnés doivent servir d'arguments a "une et une seule instance" de mon prog (sys.argv n'est surement pas l'option faite pour ca)?
 
merci d'avoir repondu
 
luffy

Reply

Marsh Posté le 05-05-2008 à 19:09:53    

luffy luck a écrit :

sys.argv n'est surement pas l'option faite pour ca


sys.argv n'a surtout aucun rapport avec le problème, pas plus que getopt ou optparse. Si ton explorateur de fichier lance une instance du programme pour chaque fichier sélectionné c'est de son côté qu'il faut voir comment résoudre le problème, et ça sera très certainement un mécanisme correspondant à ce dont multani a parlé.

 

edit: mots-clés google: python windows single instance


Message édité par masklinn le 05-05-2008 à 19:13:57

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-05-2008 à 19:38:09    

merci de ta reponse, je pensais aussi qu'il fallait regardé d'un autre coté. Je vais faire la recherche mais par contre :
mot clé : python LINUX single instance ^^ ( a moins que le "windows" que tu as mit soit a traduire litteralement ;) )
 
merci encore je reviendrai si jamais je ne trouve pas ^^.
 
luffy
 

Reply

Marsh Posté le 05-05-2008 à 19:56:33    

Ouep j'ai trouvé une solution pour avoir une seule instance de mon appli python:  
 
utiliser un class spécial "détection" d'instance utilisant deux trois commandes "bash" pour récuperer les pid des processus.
 
Je testerai si ca marche demain apres midi, je pense que ca ne devrait pas poser de problèmes.
 
Il ne restera pas plus qu'a chercher comment repasser tous les arguments sur une seule instance(plus difficil  :??: )
 
merci encore, je viendrai faire part de la méthode si tout marche
 
luffy

Reply

Marsh Posté le 05-05-2008 à 20:13:34    

Ouais, faut faire de la communication inter-processus, ça risque d'être marrant [:petrus75]

Reply

Marsh Posté le 06-05-2008 à 14:42:49    

Yep j'ai trouvé une solution encore plus simple et deja toute faite pour ne pas ouvrir deux fois la même instance.
 
Creer un mini serveur (qui ne fait qu'exister) sur un port défini, ne fermer se serveur qu'une fois l'application fermée. Et si on ouvre une deuxieme application, impossible de créer un serveur sur ce meme port=>génère une erreur   : try __ except !
 
C'est un peu barbar (et pas super propre) mais ca marche bien !  
 
placer ce code avant l'execution :
 
<code>
from asyncore import dispatcher
import sys, time, socket
 
class Server( dispatcher ):
    def __init__(self):
        dispatcher.__init__(self)
        self.create_socket( socket.AF_INET, socket.SOCK_STREAM )
        self.bind( ( '', 50000 ) )
        self.listen(1)
try:
    Server()
except:
    sys.exit()
</code>
source : http://python.developpez.com/faq/? [...] neInstance  
 
Me reste plus qu'a reussir a récuperer les arguments perdus ^^
 
yoopi : moins drole
 
luffy

Reply

Marsh Posté le 07-05-2008 à 13:28:29    

Ca y est j'ai fini.  :D . En fait le probleme venait pas du script en lui même, ca concernait tout simplement l'explorateur : nautilus. Ducoup il fallait juste que j'installe "nautilus-action" et que je configure une nouvelle action sur les fichiers image pour que tous les paramètres (images) selectionnés soient envoyés a une unique instance. (truc bidon en somme  :wahoo: ).
 
Mon project finit si ca vous interresse : (pour le code regardez la version "clean" ) :
http://luffy.luck.free.fr/dokuwiki [...] _in_python
 
merci encore pour l'aide apporté : ducoup j'ai quand même réussi a bloquer le cas "plusieurs instances ouvertes en même temp".
 
luffy

Reply

Marsh Posté le 07-05-2008 à 14:57:53    

Si je puis me permettre de critiquer :o :
 
 * tu devrais virer les chemins absolus
 * tu as le droit d'utiliser la touche espace pour aérer ton code  [:mayonaise]  
 * ya des fonctionnalités qui sont répétées, c'est pas génial (le chargement de l'image avec l'affichage de la taille par exemple)
 * la fonction de calcul pour vérifier la taille de l'image [:moule_bite] : c'est illisible (à cause des espaces et des constantes pouf comme ça), c'est beaucoup de répétition, et c'est illisible [:dawa]
 * les gros "try: [paté] except: pass" c'est mal
 * on recommande de suivre les conventions de nommage de la PEP 008
 
 ... et c'est déjà pas mal. Je pense que tu peux presque diminuer de moitié la taille de ton programme en refactorisant des trucs :jap:

Reply

Marsh Posté le 07-05-2008 à 14:57:53   

Reply

Marsh Posté le 07-05-2008 à 15:28:52    

Ouais je sais, je pourrais changer pas mal de truc, mais bon c'est mon deuxieme script python qu'est un peu élaboré, ca peu pas être parfait.
 
Et maintenant qu'on me le dit :
 
C'est clair que mon code est carrément compact,
convetion PEP 008 connais pas :  :jap:   je vais regarder ca.
Puis factorisation, c'est sur que je pourrais beaucoup plus de fonctions (=> et que je crée un module fonctions).
 
Enfin bon c'etais mon premier program utilisant les classes ... alors je m'estime déjà heureux d'avoir réussi ^^.
(les chemins absolus je garde parce que je crée des raccoursis dans un menu "prog perso" Et donc je met tjrs des chemins absolus pour éviter les erreurs.)
 
Je pense que je vais passer sur tout ca dans une phase de nétoyage... ( Et je changerai le code sur mon wiki).
 
Merci des conseils, je les prends avec le sourir ^^
 
luffy

Reply

Marsh Posté le 07-05-2008 à 15:44:13    

luffy luck a écrit :


(les chemins absolus je garde parce que je crée des raccoursis dans un menu "prog perso" Et donc je met tjrs des chemins absolus pour éviter les erreurs.)


 
Si tu veux pas enlever les chemins absolus, tu peux au moins faire une "constante" en début de script, et mettre tout tes chemins relatifs par rapport à cette constante.
Un truc du genre :

Code :
  1. BASE_PATH="/home/luffy/Programmation/Python_Projet_visionneur_Image/"
  2. ...
  3. Min1 = Tkinter.PhotoImage(file=os.path.join(BASE_PATH, "next.gif" ))


Ça te facilitera la vie, et si quelqu'un décide un jour d'utiliser ton script, ça sera plus simple aussi pour lui.
 

luffy luck a écrit :


Ouais je sais, je pourrais changer pas mal de truc, mais bon c'est mon deuxieme script python qu'est un peu élaboré, ca peu pas être parfait.
[...]
Merci des conseils, je les prends avec le sourir ^^


Tout le monde a le droit de commencer, mais c'est dommage de s'arrêter simplement ici ;)

Reply

Marsh Posté le 07-05-2008 à 18:40:11    

J'ai deja une nouvelle version a la meme adresse. Beaucoup plus factorisée et utilisant ton conseil pour le path (j'aurais su cela avant je l'aurais utilisé  ;) )
 
Sinon je pense que le code est très dur a lire aussi a cause de la syntaxe de dokuwiki (dans l'editeur de texte "eric" c'est beaucoup plus lisible).
 
Pas encore traité le cas des :    try : <code> except : pass       # demande plus de temps.
Je ne pense pas changer les noms de variables pour ce code ci (pour le prochain je ferai gaff).
 
Bonne journée et merci encore .
 
luffy
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed