[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 !

[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 28 Juin 2019 20:13, édité 3 fois.
Xubuntu 18.04
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
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) : 1108
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
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
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
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
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.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1027
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
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
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.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1027
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
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
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.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1027
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
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
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.2Windows 10Grammalecte, correcteur grammatical et orthotypographique
OlivierR
SuppOOrter
SuppOOrter
 
Message(s) : 1027
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
Libre Office 6.2.0.3
Avatar de l’utilisateur
Ernest
Membre lOOyal
Membre lOOyal
 
Message(s) : 26
Inscrit le : 26 Fév 2019 15:56


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : didier-56 et 5 invité(s)