[Résolu]-[Python] Stopper le script en fin d' exécution

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur: Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !

[Résolu]-[Python] Stopper le script en fin d' exécution

Messagepar Ernest » 22 Juin 2019 17:43


La modération a écrit:Titre modifié pour plus de clarté : merci d'éviter les redondances inutiles.

Bonsoir,

Toujours et encore le script python d' extraction de données exif. Ce script rempli sa fonction. Le fichier contenant les données et bien créer. Par contre,à la fin de l' exécution de se script, je rencontre un problème:
La fenêtre de sélection d' un fichier s' ouvre à nouveau.
J' ai tenté de résoudre ce problème en utilisant successivement les méthodes suivantes:
quit(), exit(), sys.exit(), sys.exit(0), os._exit()
A chaque fois, j' ai le message d' erreur suivant la pièce jointe.
Pour info, le script à, malgré tout fonctionné. J' ai bien un fichier .txt contenant les données recherchées.
Je vous joins également le script dans sa dernière version mais pas finale.
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from uno import *
from exiftool import *
from datetime import datetime
from fractions import *
from sys import *
from os import chdir

# Sélectionner une photographie
fchslc = ' '
def fntslc(event=None):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    create = ctx.ServiceManager.createInstance
    filepicker = create("com.sun.star.ui.dialogs.FilePicker")
    filepicker.execute()
    global fchslc
    fchslc = filepicker.Files[0]

dtpht = ' ';hrpht = ' '; exp = ' '; vlrfcl = ' '; vlrlngfcl = ' '; vrtbjc = ' '
pstfls = ' '; tpbjc = ' '
def dnxf():
    # Extraction de la date et de l' heure de prise de vue
    dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S")
    global dtpht; global hrpht
    dtpht = dt.strftime('%d-%m-%Y')
    hrpht = dt.strftime('%H:%M:%S')
    # Temps d' exposition
    global exp
    #x = int(1 / tmpxps)
    #exp = Fraction(1, x)
    # Valeur de focale
    global vlrfcl
    vlrfcl = 'f '+ str(round(fcl, 1))
    global vlrlngfcl
    vlrlngfcl = str(lngfcl)+ ' mm'
    global tpbjc
    if bjc == 53:
        tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 III'
    elif bjc == 39:
        tpbjc = 'Canon EF 75-300mm f/4-5.6'
    else:
        tpbjc = 'Inconnu'
    global vrtbjc
    #y = vrt
    #vrtbjc = format(y, '0.1f')
    # Valeur de flash
    global pstfls
    if flash == 16:
        pstfls = 'Inactif'
    else:
        pstfls = 'Actif'

#Ouverture de la fenêtre de sélection d' un fichier
fntslc()

# Recherche des balises du chemin du fichier
bls = '/'
pstbls = fchslc.rfind(bls,0,10)
xbls = fchslc.count(bls)
i = 0
while i <= xbls:
    pstbls1 = fchslc.rfind(bls)
    i = i + 1
bls2 = '.'
pstbls2 = fchslc.rfind(bls2)

# Chemin du fichier
chmfch = fchslc[pstbls:pstbls1 + 1]

# Nom de la photo
nmpht = fchslc[pstbls1 + 1:pstbls2]

# Type d' extention du fichier
xtn = fchslc[pstbls2 + 1:]

#Extraction du fabricant de l' appareil
chmfchslc = fchslc[pstbls:]
with ExifTool() as e:
    marque = e.get_tag('Make', chmfchslc)

if marque == None:
    print ("Il n' y a pas de données exif pour cette photographie !")
    marque = 'Inconnue'; mdl = 'Inconnue'; dtpht = 'Inconnue'; hrpht = 'Inconnue'
    dmspht = 'Inconnue'; tmpxps = 'Inconnue'; fcl = 'Inconnue'; lngfcl = 'Inconnue'
    iso = 'Inconnue'; vrtbjc = 'Inconnue'; lmn = 'Inconnue'; flash = 'Inconnue'
    bjc = 'Inconnue'
elif marque == 'Canon':
    with ExifTool() as e:
        mdl = e.get_tag('Model', chmfchslc)      # Modèle appareil
        dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
        dmspht = e.get_tag('ImageSize', chmfchslc)   # Dimension de la photo
        tmpxps = e.get_tag('ExposureTime', chmfchslc)   # Temps d' exposition
        fcl = e.get_tag('FNumber', chmfchslc)      # Focale
        lngfcl = e.get_tag('FocalLength', chmfchslc)   # Longueur de focale
        iso = e.get_tag('Iso', chmfchslc)      # Sensibilité
        vrt = e.get_tag('ApertureValue', chmfchslc)   # Ouverture objectif
        lmn = e.get_tag('LightValue', chmfchslc)    # Luminosité
        flash = e.get_tag('Flash', chmfchslc)      # Position flash
        bjc = e.get_tag('LensType', chmfchslc)      # Objectif utilisé
        dnxf()
elif marque == 'FUJIFILM':
    with ExifTool() as e:
        mdl = e.get_tag('Model', chmfchslc)      # Modèle appareil
        dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
        dmspht = e.get_tag('ImageSize', chmfchslc)   # Dimension de la photo
        tmpxps = e.get_tag('ExposureTime', chmfchslc)   # Temps d' exposition
        fcl = e.get_tag('FNumber', chmfchslc)      # Focale
        lngfcl = e.get_tag('FocalLength', chmfchslc)   # Longueur de focale
        iso = e.get_tag('Iso', chmfchslc)      # Sensibilité
        vrt = e.get_tag('ApertureValue', chmfchslc)   # Ouverture objectif
        lmn = e.get_tag('LightValue', chmfchslc)    # Luminosité
        flash = e.get_tag('Flash', chmfchslc)      # Position flash
        bjc = e.get_tag('LensType', chmfchslc)      # Objectif utilisé
        dnxf()
else:
    with ExifTool() as e:
        mdl = e.get_tag('Model', chmfchslc)      # Modèle appareil
        dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
        dmspht = e.get_tag('ImageSize', chmfchslc)   # Dimension de la photo
        tmpxps = e.get_tag('ExposureTime', chmfchslc)   # Temps d' exposition
        fcl = e.get_tag('FNumber', chmfchslc)      # Focale
        lngfcl = e.get_tag('FocalLength', chmfchslc)   # Longueur de focale
        iso = e.get_tag('Iso', chmfchslc)      # Sensibilité
        vrt = e.get_tag('ApertureValue', chmfchslc)   # Ouverture objectif
        lmn = e.get_tag('LightValue', chmfchslc)    # Luminosité
        flash = e.get_tag('Flash', chmfchslc)      # Position flash
        bjc = e.get_tag('LensType', chmfchslc)      # Objectif utilisé
        dnxf()

# Creation du fichier de sauvegarde
chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
fch = 'FchDn.txt'
with open('FchDn.txt', 'w') as fch:
    fch.write(chmfch)
    fch.write(' - ')
    fch.write(nmpht)
    fch.write(' - ')
    fch.write(xtn)
    fch.write(' - ')
    fch.write(marque)
    fch.write(' - ')
    fch.write(mdl)
    fch.write(' - ')
    fch.write(dtpht)
    fch.write(' - ')
    fch.write(hrpht)
    fch.write(' - ')
    fch.write(str(dmspht))
    fch.write(' - ')
#    fch.write(str(exp))
    fch.write(' - ')
    fch.write(str(vlrfcl))
    fch.write(' - ')
    fch.write(str(vlrlngfcl))
    fch.write(' - ')
    fch.write(str(iso))
    fch.write(' - ')
    fch.write(str(tpbjc))
    fch.write(' - ')
#    fch.write(str(vrtbjc))
#    fch.write(str(lmn))
    fch.write(' - ')
    fch.write(pstfls)

quit()


Que pensez-vous de se problème?

Cordialement
Pièces jointes
Capture d’écran_2019-06-22_18-31-49.png
Dernière édition par Ernest le 01 Oct 2019 15:51, édité 4 fois.
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python]-Stopper script python en fin d' exécution

Messagepar Hubert Lambert » 23 Juin 2019 09:39

Bonjour,

Avec python comme avec basic, un module est un fichier qui contient des fonctions, identifiées respectivement par un "def" ou un "sub... end sub".
Ces fonctions sont appelées par le programme via des contrôles ou des événements.
Dans ton code, tout ce qui suit le commentaire "#Ouverture de la fenêtre de sélection d'un fichier" est écrit en dehors de toute fonction, à la racine du module. Cette partie sera donc exécutée au chargement du module, ce qu'évidemment tu ne souhaites pas.
Ainsi, lorsque ton programme appelle la fonction "fntslc", le module est chargé, la fonction appelée une première fois par l'instruction "fntslc()" écrite à la racine du module, puis une seconde fois par l'appel du programme.
Autrement dit, mets toute la logique de ton code dans une fonction distincte :
Code : Tout sélectionner   AgrandirRéduire
def fonction_principale(event=None) :
    #Ouverture de la fenêtre de sélection d' un fichier
    fntslc()
    # Recherche des balises du chemin du fichier
    bls = '/'
    pstbls = fchslc.rfind(bls,0,10)
    xbls = fchslc.count(bls)
    i = 0
    [...]

Cordialement.
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python]-Stopper script python en fin d' exécution

Messagepar Ernest » 23 Juin 2019 12:58

Bonjour,
Un grand merci pour vos explications. Je découvre Python et si le langage parait simple dans une première approche, dans les faits, il réclame beaucoup de rigueur. Ce que j' apprécie le plus se sont vos commentaires très constructifs. Je m' attelle à ces modifications et vous donnerez le résultat.
Bonne journée
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 26 Juin 2019 12:43

Bonjour,
Bon, grosse déception. J' ai essayé de suivre vos indications sans que cela apporte en modifie le résultat. Je joins le code tel que je l' ai transformé afin que vous puissiez juger de la pertinence de ces modifications.
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from uno import *
from exiftool import *
from datetime import datetime
from fractions import *
from sys import *
from os import chdir

# Initialisation variables
fchslc = ' '; marque = ' '; mdl = ' '; dtpht = ' '; dmspht = ' ';hrpht = ' '
dtcrt = ' '; exp = ' '; fcl = ' '; lngfcl = ' '; vlrfcl = ' '; vlrlngfcl = ' '
iso = ' '; vrtbjc = ' '; bjc = ' '; flash = ' '; pstbls = ' '; tpbjc = ' '
chmpht = ' '; nmpht = ' '; xtnpht = ' '
# Sélectionner une photographie
def fntslc(event=None):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    create = ctx.ServiceManager.createInstance
    filepicker = create("com.sun.star.ui.dialogs.FilePicker")
    filepicker.execute()
    global fchslc
    fchslc = filepicker.Files[0]
# Extraction des données
def dnxf():
    # Extraction de la date et de l' heure de prise de vue
    dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S")
    global dtpht; global hrpht
    dtpht = dt.strftime('%d-%m-%Y')
    hrpht = dt.strftime('%H:%M:%S')
    # Temps d' exposition
    global exp
    #x = int(1 / tmpxps)
    #exp = Fraction(1, x)
    # Valeur de focale
    global vlrfcl
    vlrfcl = 'f '+ str(round(fcl, 1))
    global vlrlngfcl
    vlrlngfcl = str(lngfcl)+ ' mm'
    global tpbjc
    if bjc == 53:
        tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 III'
    elif bjc == 39:
        tpbjc = 'Canon EF 75-300mm f/4-5.6'
    else:
        tpbjc = 'Inconnu'
    global vrtbjc
    #y = vrt
    #vrtbjc = format(y, '0.1f')
    # Valeur de flash
    global pstfls
    if flash == 16:
        pstfls = 'Inactif'
    else:
        pstfls = 'Actif'
# Sélection et analyse de la photo sélectionnée
def slcpht(event = None):
    #Ouverture de la fenêtre de sélection d' un fichier
    fntslc()
    # Recherche des balises du chemin du fichier
    bls = '/'
    pstbls = fchslc.rfind(bls,0,10)
    xbls = fchslc.count(bls)
    i = 0
    while i <= xbls:
        pstbls1 = fchslc.rfind(bls)
        i = i + 1
    bls2 = '.'
    pstbls2 = fchslc.rfind(bls2)
    global chmpht; global nmpht; global xtnpht
    # Chemin de la photo
    chmpht = fchslc[pstbls:pstbls1 + 1]
    # Nom de la photo
    nmpht = fchslc[pstbls1 + 1:pstbls2]
    # Type d' extention du fichier
    xtnpht = fchslc[pstbls2 + 1:]
    #Extraction du fabricant de l' appareil
    chmfchslc = fchslc[pstbls:]
    global marque; global mdl; global dtcrt; global dmspht; global fcl; global iso
    global lngfcl; global bjc; global flash
    with ExifTool() as e:
        marque = e.get_tag('Make', chmfchslc)
    if marque == None:
        print ("Il n' y a pas de données exif pour cette photographie !")
        marque = 'Inconnue'; mdl = 'Inconnue'; dtpht = 'Inconnue'; hrpht = 'Inconnue'
        dmspht = 'Inconnue'; tmpxps = 'Inconnue'; fcl = 'Inconnue'; lngfcl = 'Inconnue'
        iso = 'Inconnue'; vrtbjc = 'Inconnue'; lmn = 'Inconnue'; flash = 'Inconnue'
        bjc = 'Inconnue'
    elif marque == 'Canon':
        with ExifTool() as e:
            mdl = e.get_tag('Model', chmfchslc)      # Modèle appareil
            dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
            dmspht = e.get_tag('ImageSize', chmfchslc)   # Dimension de la photo
            tmpxps = e.get_tag('ExposureTime', chmfchslc)   # Temps d' exposition
            fcl = e.get_tag('FNumber', chmfchslc)      # Focale
            lngfcl = e.get_tag('FocalLength', chmfchslc)   # Longueur de focale
            iso = e.get_tag('Iso', chmfchslc)      # Sensibilité
            vrt = e.get_tag('ApertureValue', chmfchslc)   # Ouverture objectif
            lmn = e.get_tag('LightValue', chmfchslc)    # Luminosité
            flash = e.get_tag('Flash', chmfchslc)      # Position flash
            bjc = e.get_tag('LensType', chmfchslc)      # Objectif utilisé
            dnxf()
    elif marque == 'FUJIFILM':
        with ExifTool() as e:
            mdl = e.get_tag('Model', chmfchslc)      # Modèle appareil
            dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
            dmspht = e.get_tag('ImageSize', chmfchslc)   # Dimension de la photo
            tmpxps = e.get_tag('ExposureTime', chmfchslc)   # Temps d' exposition
            fcl = e.get_tag('FNumber', chmfchslc)      # Focale
            lngfcl = e.get_tag('FocalLength', chmfchslc)   # Longueur de focale
            iso = e.get_tag('Iso', chmfchslc)      # Sensibilité
            vrt = e.get_tag('ApertureValue', chmfchslc)   # Ouverture objectif
            lmn = e.get_tag('LightValue', chmfchslc)    # Luminosité
            flash = e.get_tag('Flash', chmfchslc)      # Position flash
            bjc = e.get_tag('LensType', chmfchslc)      # Objectif utilisé
            dnxf()
    else:
        with ExifTool() as e:
            mdl = e.get_tag('Model', chmfchslc)      # Modèle appareil
            dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
            dmspht = e.get_tag('ImageSize', chmfchslc)   # Dimension de la photo
            tmpxps = e.get_tag('ExposureTime', chmfchslc)   # Temps d' exposition
            fcl = e.get_tag('FNumber', chmfchslc)      # Focale
            lngfcl = e.get_tag('FocalLength', chmfchslc)   # Longueur de focale
            iso = e.get_tag('Iso', chmfchslc)      # Sensibilité
            vrt = e.get_tag('ApertureValue', chmfchslc)   # Ouverture objectif
            lmn = e.get_tag('LightValue', chmfchslc)    # Luminosité
            flash = e.get_tag('Flash', chmfchslc)      # Position flash
            bjc = e.get_tag('LensType', chmfchslc)      # Objectif utilisé
            dnxf()

slcpht()
# Creation du fichier de sauvegarde
chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
fch = 'FchDn.txt'
with open('FchDn.txt', 'w') as fch:
    fch.write(chmpht)
    fch.write(';')
    fch.write(nmpht)
    fch.write(';')
    fch.write(xtnpht)
    fch.write(';')
    fch.write(marque)
    fch.write(';')
    fch.write(mdl)
    fch.write(';')
    fch.write(dtpht)
    fch.write(';')
    fch.write(hrpht)
    fch.write('')
    fch.write(str(dmspht))
    fch.write(';')
#        fch.write(str(exp))
    fch.write(';')
    fch.write(str(vlrfcl))
    fch.write(';')
    fch.write(str(vlrlngfcl))
    fch.write(';')
    fch.write(str(iso))
    fch.write(';')
    fch.write(str(tpbjc))
    fch.write(';')
#        fch.write(str(vrtbjc))
#        fch.write(str(lmn))
    fch.write(';')
    fch.write(pstfls)
sys.exit()


Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar OlivierR » 26 Juin 2019 14:57

Bonjour,

Quelques remarques.

1. Vous n’avez pas vraiment mis en application ce qui vous a été dit.

2. Il n’est pas nécessaire de lancer une fonction exit() en fin de script. Un script s’arrête tout seul quand il est arrivé au bout de sa logique. Si vous devez forcer l’arrêt d’un script, surtout en fin de script, c’est que ça ne fonctionne pas correctement. C’est comme vouloir arrêter sa voiture pendant qu’elle roule en coupant le moteur. En plus, forcer l’arrêt de Python au sein de LibreOffice est certainement une mauvaise idée, car LibreOffice se demande probablement pourquoi il y a eu un arrêt forcé. En gros, vous demandez à LibreOffice de faire des choses puis vous coupez le moteur à l’arrache en espérant que tout va bien se passer.

3. Les lignes de type:
Code : Tout sélectionner   AgrandirRéduire
from module_externe import *

ne sont pas une bonne idée, car vous incluez dans votre module toutes sortes de noms de variable que vous ne connaissez pas (les variables du module que vous importez) et qui risquent d’entrer en collision avec vos propres variables.

Il vaut mieux écrire:
Code : Tout sélectionner   AgrandirRéduire
import module

...

module.nom_de_la_fonction_dont_on_a_besoin()


ou bien
Code : Tout sélectionner   AgrandirRéduire
from module import fonction1, fonction2, fonction3

en ne spécifiant que les fonctions que vous voulez utiliser.

4. Vous devriez utiliser des noms de fonction et de variable intelligibles, sinon vous ne comprendrez plus bientôt à quoi correspond quel nom, et les autres peuvent difficilement comprendre ce que vous faites.
Dernière édition par OlivierR le 27 Juin 2019 10:17, édité 1 fois.
LibreOffice 6.3Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 26 Juin 2019 20:49

Bonsoir,
Merci de l' intérêt que vous portez à mon problème. Afin de mieux structurer mon script, bien que je doute de plus en plus que le problème provienne de cela, j' ai décidé de repartir de zéro en essayant d' appliquer les consignes que vous m' avez transmises.
Je vous joint le début du script qui pour l' instant me donne le même résultat, à savoir:
Lancement depuis le bouton du formulaire LO Base.
Ouverture de la fenêtre de sélection d' un fichier.
Après sélection de ce dernier, fermeture de cette même fenêtre.
Création du fichier de sauvegarde.
Enregistrement des données.
Et la, malheureusement....
Réouverture de la fenêtre de sélection!!!
Pour ce qui est des variables, je reconnais que de prime abord, cela est bien obscur. En fait, j' ai pris cette habitude lors de développement de logiciel d' entreprise sous acces. Je me trouvais trop souvent confronté à des erreurs d' orthographe surtout dans les longues requête en SQL. Aussi j' ai adopté une formulation simpliste en ne prenant que les trois premieres consonnes de chaque mot composant une variable.
fchslc = fichierselectionne par exemple.
Voici le début du code remanié:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from uno import *
from os import chdir

# Initialisation variables
fchslc = ' '                     # Fichier selectionne
# Ouverture fenetre de sélection
def fntslc(event=None):                  
    ctx = XSCRIPTCONTEXT.getComponentContext()
    create = ctx.ServiceManager.createInstance
    filepicker = create("com.sun.star.ui.dialogs.FilePicker")
    filepicker.execute()
    global fchslc
    fchslc = filepicker.Files[0]
# Sélectionner une photo
def slcpht():
    fntslc()
    # Creation du fichier de sauvegarde
    chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
    fch = 'FchDn.txt'
    with open('FchDn.txt', 'w') as fch:
        fch.write(fchslc)
        fch.write(';')
slcpht()

Le soucis me semble être la liaison entre LO Base et Python. Mais pourquoi?
Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar OlivierR » 27 Juin 2019 10:14

Les conseils que je vous donnais pour votre code à propos des noms de variable et de fonction sont effectivement sans rapport avec votre problème, mais je les donnais pour vous éviter de potentiels futurs ennuis.

Attendu que vous lancez la fonction slcpht() dès le chargement du script, à nouveau, comme ce qui vous a été expliqué, vous lancez votre fonction dès le chargement de LO ou du document, selon ce à quoi votre macro est liée.

Ici, vous avez peut-être mis tout votre code dans des fonctions, mais vu que vous lancez ces fonctions dès le chargement du script, vous avez le même problème. Vous avez simplement refait la même chose qu’avant mais différemment.

En théorie, avec les macros, vous créez des fonctions, mais vous ne les appelez pas immédiatement dans votre script (sauf éventuellement pour initialiser quelque chose). Comme vous l’explique Hubert Lambert, « ces fonctions sont appelées par le programme via des contrôles ou des événements ».

Par exemple, en créant un bouton dans la barre de menu, qui va appeler une fonction de macro que vous avez créée.
Avec Clic droit sur la barre d’outils > Personnaliser > Catégorie : Macro

En gros, vous déclarez vos fonctions dans votre script, mais vous ne les appelez pas à cet endroit. Vous devez créer des déclencheurs qui vont appeler ces fonctions.
LibreOffice 6.3Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 27 Juin 2019 12:36

Bonjour,

Juste un petit complément d' information, le script ne se lance pas à l' ouverture de LO Base. C' est moi qui, par l' action sur un bouton du formulaire, le lance.
D' autre part, pour pouvoir arriver au but rechercher, il faut bien commencer par ouvrir une fenêtre de sélection de fichier. Sans cette opération, rien ne peut se passer.
Pourriez-vous m' en dire plus sur ce que vous entendez par créer des déclencheurs?
Je ne vois vraiment pas comment faire autrement. :fou:

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar OlivierR » 28 Juin 2019 10:33

Vous appelez la fonction slcpht() dès le chargement du script, puisque c’est ce que vous demandez à votre script de faire. Et votre script n’attend pas que vous cliquiez sur un bouton.
Même si rien ne se passe et que rien ne s’affiche, c’est ce que le script fait.

Et la première chose que fait la fonction slcpht(), c’est appeler la fonction fntslc(). Autrement dit, votre code s’exécute dès le moment où il est chargé dans LibreOffice.
La raison pour laquelle il ne semble rien se passer à ce moment-là, je ne la connais pas, mais ça dépend la mécanique interne de LibreOffice qui ne permet pas certaines choses dans certaines conditions.

Bref, supprimez la ligne
Code : Tout sélectionner   AgrandirRéduire
slcpht()

et contentez-vous d’appeler cette fonction à partir de votre bouton.

Je suis désolé de ne pouvoir être plus précis, je n’écris jamais de macro et je ne suis pas familier de toutes les procédures de lancement.

Pour ma part, de ce que je me souviens des quelques macros que j’ai créées il y a très longtemps, je créais un bouton dans la barre d’outils et j’y associais une fonction définie dans mon code.
LibreOffice 6.3Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 28 Juin 2019 16:33

Bonjour,

Effectivement, vous avez raison. J' ai supprimé l' appel à la fonction slcpht() et sa fonctionne. Ce qui m' embête le plus, c' est de ne pas comprendre la raison du bon fonctionnement :( . Merci de votre aide car, franchement, je n' aurais jamais trouvé. En Basic ou en VBA, si l' on n' appelle pas la fonction, sa ne marche pas!!!
Du coup, je vais pouvoir passer à la suite du programme:
Importation des données dans une table LO Base.
Bonne continuation

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Résolu] - [Python] Stopper le script en fin d' exécutio

Messagepar OlivierR » 28 Juin 2019 18:09

Dans LibreOffice, vous déclarez vos fonctions, mais vous ne les lancez pas à l’intérieur du script lui-même, sauf éventuellement une fonction d’initialisation qui ne met pas en jeu des processus internes à LibreOffice. Vous lancez les fonctions au moment où vous en avez besoin. Et a priori vous n’en avez pas besoin au moment où le script est chargé.

Je ne sais pas pourquoi vous devez appeler les fonctions en Basic ou en VBA dans le script lui-même. Ça me paraît bizarre, mais soit.

Quoi qu’il en soit, c’est une grave erreur que de présumer que LibreOffice fonctionne comme Microsoft Office. Chaque suite a sa logique interne, et les nécessités de l’un ne sont pas celles de l’autre. Vous devriez éviter de présumer que parce qu’on fait une chose d’une manière avec l’une, c’est pareil dans l’autre. Ça peut l’être comme ça peut ne pas l’être. Gardez ça en tête. Ne présumez pas trop. Vérifiez.
LibreOffice 6.3Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1028
Inscrit le : 24 Mai 2006 21:34
Localisation : Lorraine, France

Re: [Résolu] - [Python] Stopper le script en fin d' exécutio

Messagepar Ernest » 28 Juin 2019 20:12

Bonsoir,

Retour à la case départ, ce bout de script qui semblait fonctionner, en fait ne fait pas grand chose. J' avais fait un test à la suite de votre précédent message en supprimant l' appel à la fonction slcpht(). La variable fchslc ne reçoit pas de valeur. Je me trouve donc obligé de revenir à la version précédente en réincluant slcpht() en fin de script

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 18 Sep 2019 19:24

Bonsoir,
Bon j' en suis toujours au même point. Puisque, a priori, le script ne s' arrête pas à cause de sa structure, j' ai refais deux nouveaux scripts qui semblait répondre à vos informations. Résultat, plus rien ne fonctionne.
J' ai donc un script principal réduit au minimum du besoin mais suffisant à mon point de vue pour aller plus loin et surtout pour comprendre le problème. Ce module importe un script qui doit permettre de sélectionner un fichier. Voici le premier code:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from uno import *
from exiftool import *
from fractions import Fraction
from datetime import datetime
from sys import *
from os import chdir
import csv
import slcpht

fchslc = ' '
def slcfch():
    slcpht.fntslc()

#Sauvegarde des données exif
chdir('/home/elfouste/Documents/Python/Svg_Csv')
with open('DnExif.csv', 'w') as f:
    f.write(str(fchslc))

Le deuxième script, devrait permettre de sélectionner un fichier. En voici le code:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

def fntslc():
    ctx = XSCRIPTCONTEXT.getComponentContext()
    create = ctx.ServiceManager.createInstance
    dsr = create("com.sun.star.ui.dialogs.OfficeFilePicker")
    dsr.setDisplayDirectory("file:///media/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/")
    dsr.execute()
    global fchslc
    fchslc = dsr.Files[0]

Lorsque je lance le module principal, j' ai un message d' erreur:
com.star.uno.RuntimeException: Error during invoking function slcfch
in module file:///home/elfouste/.config/libreoffice/4/user/Scripts/python/
test.py (<class 'Type Error'>: slcfch() takes 0 positional arguments but 1
was given
File "/opt/libreoffice6.2/program/pythonscript.py", line 907 in invoke
ret = self.func( *args))

Si vous voulez faire un test, je joins également une base allégé.
Que se passe-t-il donc?
Cordialement.
Pièces jointes
Test_Csv_HSQL.7z
(11.31 Kio) Téléchargé 8 fois
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Hubert Lambert » 18 Sep 2019 19:50

Bonjour,

Si tu appelles ta fonction slcfch() via un contrôle, le programme passe automatiquement un objet "event" à celle-ci.
La fonction doit donc être prête à le recevoir :
Code : Tout sélectionner   AgrandirRéduire
def slcfch(ev):
   ...

Si tu veux pouvoir appeler la même fonction sans paramètre, il suffit de lui donner une valeur par défaut :
Code : Tout sélectionner   AgrandirRéduire
def slcfch(ev=None):
   ...

Cordialement.
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 18 Sep 2019 20:36

Bonsoir,
Merci pour la rapidité de votre intervention. J' ai donc modifié le code du module principal:
Code : Tout sélectionner   AgrandirRéduire
def slcfch(event):
    slcpht.fntslc()

Par contre, si maintenant, la jonction a l' air de fonctionné, j' ai malgré tout un nouveau message d' erreur que j' ai ajouté sous ce texte.
cela provient-il de la position de l' importation uno?
Cordialement
Pièces jointes
Erreur_Ctx.png
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Hubert Lambert » 19 Sep 2019 16:31

La variable XSCRIPTCONTEXT est créée par le programme dans les modules qu'il charge lui-même (test.py dans ton exemple). À charge de ceux-ci de passer l'information, le cas échéant, aux modules qu'ils importent.
Autrement dit, tu fais simplement
Code : Tout sélectionner   AgrandirRéduire
def slcfch(event):
    ctx = XSCRIPTCONTEXT. getComponentContext()
    slcpht.fntslc(ctx)
et tu modifies évidemment fntslc en conséquence.
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 19 Sep 2019 16:56

Bonjour

Je suis désolé mais sa ne fonctionne pas. Suivant vos instructions, j' ai modifié le premier script suivant le code ci-dessous:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from uno import *
from exiftool import *
from fractions import Fraction
from datetime import datetime
from sys import *
from os import chdir
import csv
import slcpht

fchslc = ' '
def slcfch(event):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    slcpht.fntslc(ctx)

#Sauvegarde des données exif
chdir('/home/elfouste/Documents/Python/Svg_Csv')
with open('DnExif.csv', 'w') as f:
    f.write(str(fchslc))

Le deuxième script se présente sous la forme ci-dessous:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

def fntslc(event):
    create = ctx.ServiceManager.createInstance
    dsr = create("com.sun.star.ui.dialogs.OfficeFilePicker")
    dsr.setDisplayDirectory("file:///media/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/")
    dsr.execute()
    global fchslc
    fchslc = dsr.Files[0]

Le message d' erreur me signale:
XSCRIPTCONTEXT n' est pas défini.
L 'erreur est signalé sur cette ligne:
Code : Tout sélectionner   AgrandirRéduire
create = ctx.ServiceManager.createInstance

J' ai tenté de repassé cette ligne dans le script principal mais l' erreur est signalé sur la ligne suivante du module importé.

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Hubert Lambert » 19 Sep 2019 20:59

Vraiment ? :roll:

Code : Tout sélectionner   AgrandirRéduire
def fntslc(ctx):
   ...
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 20 Sep 2019 06:08

Bonjour Hubert,

Bon, autant pour moi, je n' avais pas penser à ajouter ctx au lieu de event! :fou:
Par contre, si je n' ai plus de message d' erreur, la sélection du fichier ne se sauvegarde pas. La fenêtre de sélection s' ouvre correctement, je peux sélectionner un fichier mais le fichier .csv reste vide.
Dur, dur

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Dude » 20 Sep 2019 16:12

Je ne comprends pas pourquoi ta fonction inclue un dialogue d'ouverture de fichier.
Ici, tu demandes comment lancer un script Python depuis Basic.
Pourquoi ne pas utiliser ce procédé ?

Tu cantonnes ta fonction à ce qu'elle doit faire : extraire les infos EXIF d'une image.
On lui passe le nom du fichier depuis une Sub Basic et elle renvoie la chaîne d'informations.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 21118
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 20 Sep 2019 16:54

Bonjour,

Le lien fourni a deux défauts,
Le premier, il concerne le lancement depuis basic, donc rien à voir avec le sujet de ce débat.
Le deuxième il ne répond pas au problème rencontré.
Le but initial de cette discussion est de stopper le script en fin de cycle. Pour l' heure, il fonctionne suivant le premier jet mais à chaque fois, il faut le réinitialiser pour effectuer une nouvelle recherche.
Afin d' éviter cela et suivant les explications fournis ici depuis le début de cette discussion, il semble nécessaire de séparer l' ouverture de la fenêtre de sélection du corps principal du script.
Hubert m' a permis d' avancer, il reste juste un bout d' explication pour comprendre pourquoi, la variable ne garde pas en mémoire le fichier sélectionné.
Donc, si vous avez une idée, je suis preneur.

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Hubert Lambert » 20 Sep 2019 19:38

Une variable globale n'existe qu'au niveau du module qui la définit et, éventuellement, des modules qui importeraient celui-ci.
Ta variable fchslc étant définie dans le module de base, elle est inaccessible pour le module slcpht.
Fais donc simple :
Code : Tout sélectionner   AgrandirRéduire
def slcfch(event):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    fchslc = slcpht.fntslc(ctx)

et
Code : Tout sélectionner   AgrandirRéduire
def fntslc(ctx) :
    [...]
    return dsr.Files[0]

Au passage, tu rendrais service à tous, toi compris, en choisissant des noms de variables plus éloquents...
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 20 Sep 2019 20:08

Bonsoir,
Décidément, je n'ai pas de chance. Votre solution ne fonctionne pas chez moi. Je joins le code des deux scripts et une copie de l' erreur mentionné.
Script principal:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from uno import *
from exiftool import *
from fractions import Fraction
from datetime import datetime
from sys import *
from os import chdir
import csv
import slcpht

fchslc = ' '

def slcfch(event):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    fchslc = slcpht.fntslc(ctx)

# Sauvegarde des données exif
chdir('/home/elfouste/Documents/Python/Svg_Csv')
with open('DnExif.csv', 'w') as f:
    f.write(fchslc)

Code module importé:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

def fntslc(ctx):
    create = ctx.ServiceManager.createInstance
    dsr = create("com.sun.star.ui.dialogs.OfficeFilePicker")
    dsr.setDisplayDirectory("file:///media/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/")
    dsr.execute()
    return dsr.Files[0]

Quand je me suis lancé dans ce projet, je ne m' attendais pas à temps de problèmes au niveau de l' importation des données. C' est dommage, car pour le reste, tout c' est mis en place sans soucis particulier.
Pour les variables, j' avoue humblement que cela soit déroutant, mais j' ai pris cette (mauvaise) habitude du temps ou je réalisai des programmes sous acces. Cela me facilité la vie au niveau des requêtes SQL.
Cordialement
Pièces jointes
Erreur_fchslc.png
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Hubert Lambert » 21 Sep 2019 08:38

Le message est explicite : tu utilises, à la ligne 10 du module slcpht.py, un attribut inexistant "files".
Fournis-nous cette partie de code, et ne perds pas de vue que python, au contraire de basic, exige un respect strict de la casse.
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 21 Sep 2019 09:46

Bonjour,

Le problème c' est que le script est complet. Il n' existe pas de ligne 10.

Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 21 Sep 2019 10:30

Bonjour,
Autant pour moi, j' ai refais des essais et maintenant, sa fonctionne. Je pense que je n' avais pas du enregistrer les modifications avant de faire les premiers essais. Python peut-il interpréter la version précédente du script si ce dernier est resté ouvert et non enregistré?
Par contre pour obtenir le résultat recherché, j' ai du placer dans le script secondaire le bout de programme pour sauvegarder le chemin du fichier sauvegardé. Cela n' est pas très gênant mais veut dire aussi que toute la récupération des données exif doit migrer dans le script secondaire.
Je vous remercie encore Hubert de la patience dont vous avez fait preuve à mon égard.
Je modifie la totalité du code et, si cela fonctionne, j' ajouterai le code définitif(en modifiant mes variables :super: ).
Cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56

Re: [Python] Stopper le script en fin d' exécution

Messagepar Hubert Lambert » 21 Sep 2019 11:44

Ta fonction de base ne peut pas fonctionner pour la raison que j'ai expliquée dans mon tout premier message. Pourquoi continuer à l'ignorer ?
Il suffit de changer
Code : Tout sélectionner   AgrandirRéduire
    fchslc = ' '
    def slcfch(event):
        ctx = XSCRIPTCONTEXT.getComponentContext()
        fchslc = slcpht.fntslc(ctx)

    # Sauvegarde des données exif
    chdir('/home/elfouste/Documents/Python/Svg_Csv')
    with open('DnExif.csv', 'w') as f:
        f.write(fchslc)
en
Code : Tout sélectionner   AgrandirRéduire
    def slcfch(event):
        ctx = XSCRIPTCONTEXT.getComponentContext()
        fchslc = slcpht.fntslc(ctx)

        # Sauvegarde des données exif
        chdir('/home/elfouste/Documents/Python/Svg_Csv')
        with open('DnExif.csv', 'w') as f:
            f.write(fchslc)
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1139
Inscrit le : 06 Avr 2016 08:26

Re: [Python] Stopper le script en fin d' exécution

Messagepar Ernest » 01 Oct 2019 08:58

Bonjour,

Voila presque une quinzaine de jour ou j' utilise la version finale de la fonction. Je ne sais si cela correspond à ce que Hubert m' a expliqué mais j' ai donc deux modules.
Un premier module principal ne servant qu' à lancer le deuxième module. Le premier script python est lance par une macro permettant d' importer le fichier csv dans la table.
Le deuxième module fait tout le travail:
Ouverture de la fenêtre de sélection
Récupération des données exif que je souhaitai récupéré.
Création et sauvegarde du fichier .csv.
Un grand merci pour la patience de Hubert et l' aide de ootremer 971 pour la macro de liaison entre Basic et Python.
Module principal:
Code : Tout sélectionner   AgrandirRéduire
!/usr/bin/env python3

from uno import *
from sys import *
from os import chdir
import csv
import slcpht

fchslc = ' '

def slcfch(event):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    fchslc = slcpht.fntslc(ctx)

Module récupérant les données exif:
Code : Tout sélectionner   AgrandirRéduire
#!/usr/bin/env python3

from exiftool import *
from os import chdir
from datetime import datetime
from fractions import Fraction

fchslc = ' '; chmcmppht = ' '; marque = ' '

def fntslc(ctx):
    create = ctx.ServiceManager.createInstance
    dsr = create("com.sun.star.ui.dialogs.OfficeFilePicker")
    dsr.setDisplayDirectory("file:///media/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/")
    dsr.execute()
    #global fchslc
    fchslc = dsr.Files[0]

    # Chemin complet du fichier
    #global chmcmppht
    bls = '/'
    pstbls = fchslc.rfind(bls,0,10)
    chmcmppht = fchslc[pstbls:]

    # Chemin du fichier
    xbls = chmcmppht.count(bls)
    i = 0
    while i <= xbls:
        pstbls1 = chmcmppht.rfind(bls)
        i = i + 1
    chmpht = chmcmppht[:pstbls1]

    # Nom de la photo
    bls2 = '.'
    pstbls2 = chmcmppht.rfind(bls2)
    nmpht = chmcmppht[pstbls1 + 1:pstbls2]

    # Récupération des données exif
    with ExifTool() as e:
        marque = e.get_tag('Make', chmcmppht)
    if marque == None:
        print ("Il n' y a pas de données exif pour cette photographie !")
        marque = 'Inconnue'; xtnpht = 'Inconnue'; mdl = 'Inconnue'; dtpht = 'Inconnue'; hrpht = 'Inconnue'
        dmspht = 'Inconnue'; tmpxps = 'Inconnue'; fcl = 'Inconnue'; lngfcl = 'Inconnue'
        iso = 'Inconnue'; vrtbjc = 'Inconnue'; lmn = 'Inconnue'; flash = 'Inconnue'
        bjc = 'Inconnue'
    elif marque == 'Canon':
        with ExifTool() as e:
            xtnpht = e.get_tag('FileTypeExtension', chmcmppht)
            vlrmdl = e.get_tag('Model', chmcmppht)
            bjc = e.get_tag('LensType', chmcmppht)
            dtcrt = e.get_tag('DateTimeOriginal', chmcmppht)
            lrg = e.get_tag('ImageWidth', chmcmppht)
            htr = e.get_tag('ImageHeight', chmcmppht)
            xps = e.get_tag('ExposureTime', chmcmppht)
            vlrfcl = e.get_tag('FNumber', chmcmppht)
            vlrlngfcl = e.get_tag('FocalLength', chmcmppht)
            iso = e.get_tag('Iso', chmcmppht)
            vlrlmn = e.get_tag('LightValue', chmcmppht)
            pstflash = e.get_tag('Flash', chmcmppht)
    elif marque == 'FUJIFILM':
        with ExifTool() as e:
            xtnpht = e.get_tag('FileTypeExtension', chmcmppht)
            vlrmdl = e.get_tag('Model', chmcmppht)
            bjc = e.get_tag('LensType', chmcmppht)
            dtcrt = e.get_tag('DateTimeOriginal', chmcmppht)
            lrg = e.get_tag('ImageWidth', chmcmppht)
            htr = e.get_tag('ImageHeight', chmcmppht)
            xps = e.get_tag('ExposureTime', chmcmppht)
            vlrfcl = e.get_tag('FNumber', chmcmppht)
            vlrlngfcl = e.get_tag('FocalLength', chmcmppht)
            iso = e.get_tag('Iso', chmcmppht)
            vlrlmn = e.get_tag('LightValue', chmcmppht)
            pstflash = e.get_tag('Flash', chmcmppht)
    else:
        with ExifTool() as e:
            xtnpht = e.get_tag('FileTypeExtension', chmcmppht)
            vlrmdl = e.get_tag('Model', chmcmppht)
            bjc = e.get_tag('LensType', chmcmppht)
            dtcrt = e.get_tag('DateTimeOriginal', chmcmppht)
            lrg = e.get_tag('ImageWidth', chmcmppht)
            htr = e.get_tag('ImageHeight', chmcmppht)
            xps = e.get_tag('ExposureTime', chmcmppht)
            vlrfcl = e.get_tag('FNumber', chmcmppht)
            vlrlngfcl = e.get_tag('FocalLength', chmcmppht)
            iso = e.get_tag('Iso', chmcmppht)
            vlrlmn = e.get_tag('LightValue', chmcmppht)
            pstflash = e.get_tag('Flash', chmcmppht)

    # Clé du fichier
    cfpht = 1

    # Nom de l' appareil photo
    bls3 = ' E '
    if marque == 'Canon':
        pstbls3 = fchslc.rfind(bls3)
        mdl = vlrmdl[6:len(vlrmdl)]
    elif marque == 'FUJIFILM':
        mdl = vlrmdl
    else:
        mdl = 'Inconnu'

    # Type d' objectif utilisé
    if bjc == 53:
        tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 III'
    elif bjc == 45:
        tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 [II]'
    elif bjc == 39:
        tpbjc = 'Canon EF 75-300mm f/4-5.6'
    else:
        tpbjc = 'Inconnu'

    # Extraction de la date et de l' heure de prise de vue
    dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S")
    dtpht = dt.strftime('%d-%m-%Y')
    hrpht = dt.strftime('%H:%M:%S')

    # Dimension de la photo
    dmspht = '%s*%s' % (lrg, htr)

    # Temps d' exposition
    x = Fraction(xps).limit_denominator(1000)
    nmr = x.numerator
    dnm = x.denominator
    tmpxps = '%s/%s' % (nmr, dnm)

    # Valeur de focale
    fcl = 'f '+ str(round(vlrfcl, 1))
   
    # Longueur de focale
    lngfcl = str(vlrlngfcl)+ ' mm'

    # Valeur de luminosité
    lmn = round(vlrlmn,1)

    # Valeur de flash
    if pstflash == 16:
        pstfls = 'Inactif'
    else:
        pstfls = 'Actif'

    #Sauvegarde des données exif
    chdir('/home/elfouste/Documents/Python/Svg_Csv')
    with open('DnExif.csv', 'w') as f:
        f.write('Cf_Pht'); f.write(','); f.write('ChmPht'); f.write(','); f.write('NmPht')
        f.write(','); f.write('XtnPht'); f.write(','); f.write('Fbc'); f.write(',')
        f.write('MdlApp'); f.write(','); f.write('Bjc'); f.write(','); f.write('DtPht')
        f.write(','); f.write('HrPht'); f.write(','); f.write('DmsPht')
        f.write(','); f.write('TmpXps'); f.write(','); f.write('Fcl')
        f.write(','); f.write('LngFcl'); f.write(','); f.write('Sns')
        f.write(','); f.write('Lmn'); f.write(','); f.write('PstFlsh')
        f.write(','); f.write('ChmCmpPht')
        f.write('\n')
        f.write(str(cfpht)); f.write(','); f.write(chmpht); f.write(','); f.write(nmpht)
        f.write(','); f.write(xtnpht); f.write(','); f.write(marque); f.write(',')
        f.write(mdl); f.write(','); f.write(tpbjc); f.write(','); f.write(str(dtpht))
        f.write(','); f.write(str(hrpht)); f.write(','); f.write(dmspht);f.write(',')
        f.write(str(tmpxps)); f.write(','); f.write(fcl);f.write(','); f.write(lngfcl)
        f.write(','); f.write(str(iso)); f.write(','); f.write(str(lmn));f.write(',')
        f.write(pstfls); f.write(','); f.write(chmcmppht)


Je ne prétends pas que ces codes sont au top et peuvent sûrement être encore améliorés mais sa fonctionne suivant ce que je m' étais fixé.

Encore merci de votre aide.
Bien cordialement
Xubuntu 18.04 en dual boot avec Win10
Libre Office 6.2.8
Avatar de l’utilisateur
Ernest
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 73
Inscrit le : 26 Fév 2019 15:56


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : MSN [Bot] et 3 invité(s)