IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

TKinter pb fonctions


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut TKinter pb fonctions
    Bonjour,

    J'ai crée une fonction qui ouvre juste une fenêtre d'alerte avec un seul bouton pour sortir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import os.path
    from os import chdir        # Pour chargement des images dans autre répertoire chdir = chg de répertoire
    from tkinter import *
    #   Instancification
    fenMsgBox =Tk()
     
    def foncFenAlerte1Choix(titre, msg):
        """MsgBox d'alerte, un seul choix : fermeture"""
        #   Constantes
        NOMDOS = os.getcwd()                                    #   Nom du dossier courant
        chdir(NOMDOS + '\Images')                               #   Chg de répertoire courant pour charger les images
        PHOTO4 = PhotoImage(file='Icone30x30_Exit.png')
        chdir(NOMDOS)                                           #   Chg de répertoire courant pour revenir a la normale
        #   Création fenêtre
        fenMsgBox.title(titre)
        fenMsgBox.configure(bg="Slate Gray")
        fenMsgBox.geometry('300x360+670+400')
        #   Objets
        objMsgBox1 = Label(fenMsgBox, height=20, width=40, text=msg, bg="Gray")
     
     
        #  C'est là qu'est le soucis à cause de image=PHOTO4
        bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
     
     
     
     
        #   positionnements des objets
        objMsgBox1.pack(side=TOP)
        bouValidMsgBox.pack(side=BOTTOM)
        #   Centrage fenêtre
        from Fonctions.FoncCentreEcran import centreFenetre
        centreFenetre (fenMsgBox)
        #   Fenêtre fenMsgBox en 1er plan
        fenMsgBox.focus_set()
        #   Réception d'événements pour fenMsgBox
        fenMsgBox.mainloop()
    Si je l'appelle comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    msg="Mon msg :\n\nVoulez-vous vraiment supprimer cette donnée ?"
    titre="monTitre"
     
    from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
    foncFenAlerte1Choix(titre, msg)
    pas de soucis, par contre si je l'appelle de la même façon à partir d'un programme, je met juste un morceau de code car trop de lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if varNom=="" or varLog=="" or varCode=="":
            titre = "ALERTE !"
            msg = "Vous n'avez rien indiqué\ndans la case NOM, LOGGING\nou dans la case CODE !"
            from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
            foncFenAlerte1Choix (titre, msg)
            return
    Là j'ai ce msg d'erreur:
    _tkinter.TclError: image "pyimage21" doesn't exist

    J'ai trouvé quelques explications sur le net, cela viendrais de PhotoImage et en effet si je retire juste l'appel à l'image :
    Là c'est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        bouValidMsgBox = Button(fenMsgBox, bg="Slate Gray", command=fenMsgBox.destroy)
    Là non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
    Je comprends pas d'ou viens le problème !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par Ragus1970 Voir le message
    Je comprends pas d'ou viens le problème !
    Sauf exception, vous ne devez avoir qu'une seule fenêtre principale (un seul appel à Tk()) dans votre programme et utiliser Toplevel pour les fenêtres secondaires.
    Dans le cas contraire vous devez préciser à quel environnement Tk seront associées toutes les variables qui se cachent dérrière widgets, Variable, PhotoImage,... Car par défaut, ils seront crées dans le premiers et innaccessibles depuis les autres (dans image "pyimage21" doesn't exist, pyimage21 est une variable TCL/Tk associée à l'image).

    - W

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Sur une seule application, la fenêtre principale en Tk et les suivantes en TopLevel, ça OK.
    Mais si a partir de là, j'ouvre avec call une autre application indépendante, il ne doit pas y avoir de Tk ?
    Toutes les fenêtre doivent être déclarées en TopLevel ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    Mais si a partir de là, j'ouvre avec call une autre application indépendante, il ne doit pas y avoir de Tk ?
    Toutes les fenêtre doivent être déclarées en TopLevel ?
    Une application indépendante, c'est un autre espace mémoire qui aura son propre interpréteur Python et son propre interpréteur TCL. Il lui faudra aussi son Tk().
    note: il n'est pas interdit d'avoir plusieurs instances de Tk() dans une application, juste qu'il ne faut pas oublier de préciser dans quel Tk sont créés ses objets (i.e. ne pas laissez faire le "défaut").

    - W

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    D'accord, donc si j'ai bien compris, le soucis est au niveau de cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHOTO4 = PhotoImage(file='Icone30x30_Exit.png')
    quand j'appelle cette fonction à partir d'un programme qui a déja une fenêtre Tk


    Comment j'indique pour quel Tk est PHOTO4 ?

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Bon, j'ai résolu en changeant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #   Instancification
    fenMsgBox = Tk()
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #   Instancification
    fenMsgBox = Toplevel()
    Dans la fonction : FoncMesAlerte1button.pyw.
    Ceci dit je voudrais bien la commande pour indiquer pour quel Tk est PHOTO4

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par Ragus1970 Voir le message
    Comment j'indique pour quel Tk est PHOTO4 ?
    C'est une information que vous pourriez trouver vous même en ayant le réflexe d'ouvrir votre documentation ou bien de lancer la console Python pour y taper:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> help(tk.PhotoImage.__init__)
    Help on function __init__ in module tkinter:
     
    __init__(self, name=None, cnf={}, master=None, **kw)
        Create an image with NAME.
     
        Valid resource names: data, format, file, gamma, height, palette,
        width.
     
    >>>
    l'argument est "master". Mais il y a un piège car vous ne pourrez pas écrire: PhotoImage(fenêtre, file=...)car dans ce cas, fenêtre sera pris comme premier argument i.e. name. Il faudra forcer un peu avec PhotoImage(master=fenêtre, file=...)- W

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Merci, j'ai cherché un peu mais je ne savais pas trop comment pour ce problème.

    En tout cas tes explications sont claires, je pense avoir compris, merci encore.

  9. #9
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Salut,

    J'ai un autre soucis, j'ai donc indiqué dans ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHOTO4 = PhotoImage(master=fenMsgBox, file='Icone30x30_Exit.png')
    et cela fonctionne, merci, le soucis est que je ne peut le faire qu'une fois car ensuite j'ai ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _tkinter.TclError: can't invoke "image" command: application has been destroyed
    Je comprends qu'il faut 'killer' PHOTO4 en sortant de la fonction, mais je ne vois pas ou mettre le code :
    dans la sortie de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
    J'ai essayé de créer une fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    aa():
        del PHOTO4
        fenMsgBox.destroy()
    en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=aa())
    Là, Python me dit que je veut supprimer PHOTO4 avant qu'il soit assigné, je ne vois pas comment faire !

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par Ragus1970 Voir le message
    je ne vois pas comment faire !
    Un seul Tk() pour la fenêtre principale et Toplevel() pour les fenêtres secondaires.
    Pour le reste, si vous créez une boîte et y collez des objets dedans, détruire la boîte/contenant, c'est aussi détruire tout ce que vous y avez mis dedans. Normal non?

    - W

  11. #11
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Oui, je pensais que lorsque je quittais ma fonction par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
    Cela allait me killer aussi PHOTO4 mais losque je ré-appelle ma fonction, j'ai ce msg d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _tkinter.TclError: can't invoke "image" command: application has been destroyed
    J'ai essayé, toujours dans la fonction que j'appelle de remplacer :
    par
    Là pareil, cela marche une fois puis si je recommence, j'ai ce msg d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _tkinter.TclError: bad window path name ".!toplevel2"
    Info supplémentaire mais je ne pense pas que cela pose problème, j'appelle ma fonction à partir d'une autre fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def foncBoutNewValid():
        """ Bouton de validation permettant de créer une nouvelle fiche"""
        #       Récupération des données de la fenêtre NEW (création d'un nouveau code)
        varNom = ObjNewNom.get()
        varLog = ObjNewLog.get()
        varCode = ObjNewCode.get()
        varRens = objNewRenseig.get(1.0,'end')
        #   Récupération de la case à cocher
        if varCacheeO_N2.get():
            varCase = True  # Coché
        else:
            varCase = False  # Pas coché
        #   Vérification 1 - log ou code vide
        if varNom=="" or varLog=="" or varCode=="":
            titre = "ALERTE !"
            msg = "Vous n'avez rien indiqué\ndans la case NOM, LOGGING\nou dans la case CODE !"
            # fonctMsgBox1(msg, titre)
            from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
            foncFenAlerte1Choix (titre, msg)
            return

  12. #12
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    J'oubliai,

    PHOTO4 existe aussi dans la fonction principale (Tk) qui appelle la fonction secondaire (Toplevel) ou on demande aussi PHOTO4.


    Donc :
    Fenêtre principale (Tk) utilise et reconnais PHOTO4
    puis il appelle la fonction (TopLevel) foncFenAlerte1Choix, la aussi : utilise et reconnais PHOTO4
    puis je sort de la fonction secondaire : command=fenMsgBox.destroy : aucun soucis
    puis je ré-appelle cette fonction toujoirs à partir de la fenêtre principale et là, ça veut pas !

    Voilà, j'espère avoir été clair, c'est pour faire mes propres fenêtre d'alertes.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par Ragus1970 Voir le message
    Voilà, j'espère avoir été clair, c'est pour faire mes propres fenêtre d'alertes.
    Ce serait bien plus clair si vous écriviez un petit exemple qui montre ce dont vous parlez et permette de reproduire quelque chose.
    note: moi, à part écrire faire un exemple qui fonctionne en interprétant ce que vous racontez avec les contraintes tkinter, çà va fonctionner mais çà passera à côté du soucis que vous avez.

    - W

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    OK, je m'y met

  15. #15
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    voilà, c'est vite fait, mais le pb est présent, j'ai laissé en fonction exprès pour être dans le même contexte.


    La fonction que j'appelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    import os.path
    from os import chdir        # Pour chargement des images dans autre répertoire chdir = chg de répertoire
    from tkinter import *
    #   Instancification
    fenMsgBox = Toplevel()#Tk()
    #
    # def hh():
    #     del PHOTO4
    #     fenMsgBox.destroy ()
     
     
     
    def foncFenAlerte1Choix(titre, msg):
        """MsgBox d'alerte, un seul choix : fermeture"""
        #   Constantes
        NOMDOS = os.getcwd()                                    #   Nom du dossier courant
        chdir(NOMDOS + '\Images')                               #   Chg de répertoire courant pour charger les images
        PHOTO4 = PhotoImage(master=fenMsgBox, file='Icone30x30_Exit.png')
        chdir(NOMDOS)                                           #   Chg de répertoire courant pour revenir a la normale
        #   Création fenêtre
        fenMsgBox.title(titre)
        fenMsgBox.configure(bg="Slate Gray")
        fenMsgBox.geometry('300x360')
        #   Objets
        objMsgBox1 = Label(fenMsgBox, height=20, width=40, text=msg, bg="Gray")
     
     
     
        bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
        # bouValidMsgBox = Button (fenMsgBox, image=PHOTO4, bg="Slate Gray", command=hh())
     
     
     
        #   positionnements des objets
        objMsgBox1.pack(side=TOP)
        bouValidMsgBox.pack(side=BOTTOM)
        #   Centrage fenêtre
        from Fonctions.FoncCentreEcran import centreFenetre
        centreFenetre (fenMsgBox)
        #   Fenêtre fenMsgBox en 1er plan
        fenMsgBox.focus_set()
        #   Réception d'événements pour fenMsgBox
        fenMsgBox.mainloop()
    Le code qui appelle la fonction au dessus, appuyez sur <repeat>, fermez la fenêtre qui s'ouvre puis ré-appuyez sur <repeat> et là ça plante !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #   Imports
    import os.path
    from os import chdir       
    from tkinter import *
     
    # Création de l'instance Tk
    fen1 =Tk()
    #   Constantes
    NOMDOS = os.getcwd()                                    #   Nom du dossier courant
    #   Chargement des images
    chdir(NOMDOS + '\Images')                               #   Chg de répertoire courant pour charger les images
    PHOTO4 = PhotoImage(file='Icone30x30_Exit.png')
    chdir(NOMDOS)                                           #   Chg de répertoire courant pour revenir a la normale
     
    #   FONCTION : ALERTE___________________________________________________________________________________________________
    def go():
        """ Bouton de validation permettant de créer une nouvelle fiche"""
        titre = "ALERTE !"
        msg = "Vous n'avez rien indiqué\ndans la case NOM, LOGGING\nou dans la case CODE !"
        from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
        foncFenAlerte1Choix (titre, msg)
     
    #   FONCTION : CREATION DE NOUVELLE FICHE_______________________________________________________________________________
    def foncBoutNewValid():
        #       Ouverture fenêtre de saisie
        fenNew = Toplevel()
        fenNew.title("Nouveau code")
        fenNew.geometry('480x290')
        #   Créa bouton Validation
        bouValidNew = Button(fenNew, text = "repeat", command=go)
        #   Créa bouton Annuler
        bouQuitNew = Button(fenNew, image=PHOTO4, command=fenNew.destroy)
        #   positionnement
        bouValidNew.pack()
        bouQuitNew.pack()
        #   Mainloop
        fenNew.mainloop()
     
    #   MAIN
    foncBoutNewValid()
     
    fen1.mainloop()

  16. #16
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    J'ai oublié de virer cet appel de fonction, vous pouvez supprimer ces 3 lignes, le problème reste le même


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        #   Centrage fenêtre
        from Fonctions.FoncCentreEcran import centreFenetre
        centreFenetre (fenMsgBox)

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Mouais...
    Le principal soucis est là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def go():
    ...
        from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
        foncFenAlerte1Choix (titre, msg)
    Car après le premier import, le code du module qui créé la fenêtre fenMsgBox ne sera plus exécuté... donc il ne restera la fenêtre détruite le coup d'avant....

    Dans le tuto qui vient avec Python (et qui est disponible en français), çà dit:
    Un module peut contenir aussi bien des instructions que des déclarations de fonctions. Ces instructions permettent d’initialiser le module. Elles ne sont exécutées que la première fois que le nom d’un module est trouvé dans un import [1] (elles sont aussi exécutées lorsque le fichier est exécuté en tant que script).
    - W

  18. #18
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    OK, merci, si j'ai bien compris, il faut que j'utilise le fameux J'y arrive pas.


    J'ai essayé dans la fonction qui appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        """ Bouton de validation permettant de créer une nouvelle fiche"""
        titre = "ALERTE !"
        msg = "Vous n'avez rien indiqué\ndans la case NOM, LOGGING\nou dans la case CODE !"
        # from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
        # foncFenAlerte1Choix (titre, msg)
     
        if __name__ == "__main__":
            from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
            foncFenAlerte1Choix (titre, msg)

    J'avoue que je nage !
    Je veux bien un coup de pouce supplémentaire !

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    Je veux bien un coup de pouce supplémentaire !
    Si un module n'est chargé qu'une seule fois, autant éviter de mettre des from ... import ... à l'intérieur de fonctions: les imports, c'est seulement au début d'un module. Ce qui va vous oblige à revoir votre découpage.

    note: et je ne peux pas vous donner de coup de pouce car vous avez un soucis de conception (comment vous avez pensé çà) basé sur une forte incompréhension de ce que sont fonctions, modules,... Ouvrir un tuto pour comprendre comment çà fonctionne, tester pour vérifier que çà fonctionne bien comme vous l'avez compris,... est un préalable pour revoir la distribution des rôles dans votre code. Ceci dit, si vous ne savez pas encore découper votre code en modules, vous n'y êtes pas obligé: çà fonctionnera aussi bien avec tout dans le même script (et ce sera moins difficile).


    - W

  20. #20
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Je découpe en module car c'est une fonction que je vais utiliser un peu partout.

    Si un module n'est chargé qu'une seule fois, autant éviter de mettre des from ... import ... à l'intérieur de fonctions: les imports, c'est seulement au début d'un module.
    Merci, c'est une information que je ne connaissait pas.

    Je vais potasser.

Discussions similaires

  1. python, tkinter, associer fonction et affichage
    Par thibéo dans le forum Général Python
    Réponses: 1
    Dernier message: 14/03/2016, 08h55
  2. Tkinter fonction .place() problème
    Par R3iD0r dans le forum Tkinter
    Réponses: 11
    Dernier message: 04/10/2010, 14h11
  3. scope des sous fonction et TkInter
    Par sopsag dans le forum Général Python
    Réponses: 14
    Dernier message: 30/10/2009, 17h12
  4. Réponses: 2
    Dernier message: 27/05/2007, 02h38
  5. problème d'appel de fonction avec bind (en Tkinter)
    Par piotrr dans le forum Tkinter
    Réponses: 4
    Dernier message: 09/05/2007, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo