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

Vue hybride

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    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 confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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