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 :

detruire widget : pb de visibilité ? [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut detruire widget : pb de visibilité ?
    Bonsoir,
    Je suis débutant sous tkinter et je voudrais détruire un widget dans une 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
    21
    22
    23
    24
    25
    26
    27
     
    def Evaluation(evt) :
        fen_Sel_Classe.destroy
     
    fichier_Classes=open("classes.csv","r")
    liste_Classes=fichier_Classes.readlines()
    fichier_Classes.close
     
    fenster = Tk()
    fenster.title('Titre')
     
    fen_Sel_Classe=Frame(fenster,bg='white',borderwidth=1)
    fen_Sel_Classe.pack(fill=BOTH)
     
    champ_label = Label(fen_Sel_Classe, text="Choisissez une classe : ")
    champ_label.pack()
    liste=Listbox(fen_Sel_Classe)
    for element in liste_Classes:
        detail=element.split(";")
        liste.insert(END,detail[0])
    liste.bind('<ButtonRelease-1>',Evaluation)
    liste.pack()
     
    bouton_quitter = Button(fenster, text="Quitter", command=fenster.quit)
    bouton_quitter.pack(side=BOTTOM)
    #--------Sortie interface graphique -------------
    fenster.mainloop()
    Rien ne se passe, je suppose que le widget n'est pas visible dans la fonction.
    Comment résoudre cela sachant que la fonction "Evaluation" reçoit déjà un argument (evt) dont je n'ai aucun contrôle ?

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par ltisn Voir le message
    Rien ne se passe, je suppose que le widget n'est pas visible dans la fonction.
    Comment résoudre cela sachant que la fonction "Evaluation" reçoit déjà un argument (evt) dont je n'ai aucun contrôle ?
    Si la variable associée au widget n'était pas visible, vous auriez une erreur de type "NameError" et si vous doutez que la fonction soit appelée, l'instruction magique "print" donnerait une réponse. En tout cas, avec Python, "appeler une fonction" c'est un nom qui se termine par (...), les '...' étant à remplacer par les éventuels arguments

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    J'ai testé l'accès au 'Frame' dans la 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    from tkinter import *
     
    def Evaluation(evt) :
        # Récupération classe
        i=liste.curselection()
        classe=liste.get(i)
        champ_label = Label(fen_Sel_Classe, text="classe choisie: "+classe)
        champ_label.pack()
        fen_Sel_Classe.destroy
        fen_eval=Frame(fenster, borderwidth=1)
        fen_eval.pack(fill=BOTH)
        champ_label2 = Label(fen_eval, text="Choisissez l'item")
        champ_label2.pack()  
     
     
    #-----Lecture des données -----------------------------------
    fichier_Classes=open("classes.csv","r")
    liste_Classes=fichier_Classes.readlines()
    fichier_Classes.close
     
     
    #----- fenêtre graphique principale-----------------------------------
    fenster = Tk()
    #fenster.geometry("768x576")
    fenster.title('Évaluation')
     
    #---------- Selection Classe -------------------
    fen_Sel_Classe=Frame(fenster,bg='white',borderwidth=1)
    fen_Sel_Classe.pack(fill=BOTH)
    champ_label = Label(fen_Sel_Classe, text="Choisissez une classe : ")
    champ_label.pack()
    liste=Listbox(fen_Sel_Classe)
    for element in liste_Classes:
        detail=element.split(";")
        liste.insert(END,detail[0])
    liste.bind('<ButtonRelease-1>',Evaluation)
    liste.pack()
    bouton_evaluer = Button(fenster, text="Évaluer", command=Evaluation)
    bouton_evaluer.pack(side=BOTTOM)
    #-------- Quitter l'application ------------------
    bouton_quitter = Button(fenster, text="Quitter", command=fenster.quit)
    bouton_quitter.pack(side=BOTTOM)
    #--------Sortie interface graphique -------------
    fenster.mainloop()
    J'ai bien le choix de la liste déroulante qui s'affiche lorsque je sélectionne une valeur. C'est donc que la fonction a accès au frame 'fen_Sel_Classe'. Par contre la méthode destroy est sans effet alors qu'elle fonctionne dans le programme principal. Le label lui est bien placé, en résumé seul le destroy ne fonctionne pas.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par ltisn Voir le message
    Par contre la méthode destroy est sans effet alors qu'elle fonctionne dans le programme principal.
    Relisez ma réponse précédente au sujet des "()".
    Tant que vous ne savez pas faire la différence entre ".destroy" et ".destroy()", le code "fonctionnera" (sans erreur) et sans rien faire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    OK. J'avais mal interprété votre réponse. Ça fonctionne, merci.
    J'aimerais toutefois comprendre la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Button(Frame2,text="Effacer",fg='navy',command=Frame2.destroy).pack(padx=10,pady=10)
    pas besoin de paranthèses
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fen_Sel_Classe.destroy()

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    func() appelle cette fonction "maintenant".
    command=func passe en paramètre la fonction à appeler lorsque l'utilisateur clique sur le bouton.
    Et comme ce n'est pas depuis votre code que cette fonction là sera appelée mais depuis l'interface graphique, on préférera lui donner le nom de "callback".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette précision.
    Bonne soirée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. visibilité d'un widget
    Par ribeheld dans le forum Windows Forms
    Réponses: 0
    Dernier message: 13/09/2011, 11h38
  2. detruire un fichier
    Par Mau dans le forum C
    Réponses: 11
    Dernier message: 20/11/2003, 11h16
  3. [SWT]Eclipse Java : swt.widgets.Table
    Par watson dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 01/10/2003, 09h07
  4. [][Excel] Comment ne pas détruire les formules ?
    Par flyangelNext dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/07/2003, 11h38
  5. [ActiveX] Visibilité d'une propriété
    Par paradise dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/11/2002, 18h33

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