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 :

Impossible de destroy() un button et une listbox


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 45
    Points : 38
    Points
    38
    Par défaut Impossible de destroy() un button et une listbox
    Bonjour,

    J'ai actuellement un bouton et une listbox rebelles impossible à destroy(), et ils ont en commun le fait que le bouton se crée dès que la listbox reçoit l'événement '<ButtonRelease-1>'.
    La listbox, elle est créée dans une classe qui hérite de Listbox jusque là rien d'anormal, mais lorsque je souhaite supprimer un de ces deux contrôles, rien ne se passe, pas d'erreur rien.
    Le problème doit surement venir de quelque part mais impossible à trouver ..

    Merci à vous, toute aide sera grandement apprécié.

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

    Si çà ne fonctionne pas, c'est que vous n'avez pas codé cela "proprement". Et si vous ne montrez pas votre code, difficile de vous dire quoi que ce soit...

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Oui je le pense aussi pourtant je l'ai codé comme le reste de l'application et tout le reste fonctionne nickel, voici le code de la listbox :

    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
     
    class ListBateau(Listbox):
     
        def __init__(self, parent):
            Listbox.__init__(self, height=4, width=35 )
            self.parent = parent
            self.typeBateauSelect = None
     
            self.Initialize()
     
        def Initialize(self):
     
            if(self.size() != 0):
                self.ClearListBox()
     
            i = 0
            for bateau in self.parent.oActualPlayer.bateaux:
     
                if(bateau.position == None):
                    pos = '?'
                else:
                    pos = ""
                    for coord in bateau.position:
                        pos +=  coord + ' '
     
                self.insert(END, '[' + str(i) + '] [PDV : ' + str(bateau.pdv) + '] [POS : ' + pos + '] [' + bateau.orientation + ']')
                i += 1
            self.grid(row=3, column=0)
            self.bind('<ButtonRelease-1>', self.parent.SelectBateau)
     
        def ClearListBox(self):
            self.delete(0, (self.size() - 1))
    Fonction lancé quand l'événement sur la listbox apparait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        def SelectBateau(self, event):
            self.listBateau.typeBateauSelect = self.listBateau.curselection()[0]
            if(self.etat == 'preparatoir'):
                self.buttonChangeOrt = Button(self, text='Pivoter', command=self.grille.ChangeOrientation)
                self.buttonChangeOrt.grid(row=5)
    Et le code ou le bouton devrait disparaitre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def NextPlayer(self):
            if(self.etat == 'preparatoir' and self.oActualPlayer == self.oPlayer2):
                self.buttonChangeOrt.destroy()
                self.etat = 'play'
                showinfo('Information', 'La partie commence, préparez vous !')
    Les deux derniers code se trouvent dans la classe master qui hérite donc de Tk

    Merci pour ton aide !

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

    Si vous ne postez pas un code fonctionnel et minimal (juste pour reproduire le problème)...
    Est ce que le "showinfo('Information', 'La partie commence, préparez vous !')" affiche quelque chose?

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Oui tout fonctionne le code passe bien dans la condition, cependant le destroy() ne fonctionne pas.
    Après je vous ai donnez quelques morceaux de code, pour avoir un code fonctionnel il faudrait rajouter beaucoup trop de chose, ce serait trop long.
    Je vais voir ce que je peux rajouter pour vous aider.

    Merci.

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Si vous ne postez pas un code fonctionnel et minimal (juste pour reproduire le problème)...
    Est ce que le "showinfo('Information', 'La partie commence, préparez vous !')" affiche quelque chose?

    - W

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

    Peut être ajouter un "self.update()" juste après l'appel à .destroy?

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

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Non plus ..

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Peut être ajouter un "self.update()" juste après l'appel à .destroy?

    - W
    Regardez ce code, il est fonctionnel, c'est juste un code de test :

    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
    46
    47
    48
    49
    50
    51
    52
     
    from tkinter import *
     
    class Application(Tk):
     
        def __init__(self):
            Tk.__init__(self) 
            self.indexList = None
     
            self.Initialize()
     
        def Initialize(self):
            self.listbox = ListBateau(self)
            Button(self, text='Supprime', command=self.Sup).grid()
            self.label = Label(self, text='')
            self.label.grid()
     
        def SelectBateau(self, event):
            self.indexList = self.listbox.curselection()[0]
            self.buttonChangeOrt = Button(self, text='Pivoter')
            self.buttonChangeOrt.grid(row=5)
            self.label.config(text=self.indexList)
     
        def Sup(self):
            self.buttonChangeOrt.destroy()
            self.listbox.destroy()
     
    # ----
     
    class ListBateau(Listbox):
     
        def __init__(self, parent):
            Listbox.__init__(self, height=4, width=35 )
            self.parent = parent
     
            self.Initialize()
     
        def Initialize(self):
     
            for i in range (5):
                self.insert(END, i)
     
            self.grid()
            self.bind('<ButtonRelease-1>', self.parent.SelectBateau)
     
    # ---
     
    if __name__ == '__main__':
     
        app = Application() # Création de la fenetre
     
        app.mainloop()
    Si quand on lance l'app et que l'on clique une fois sur la liste puis sur supprimé tout s'efface bien, mais a partir du moment ou l'on clique plus d'une fois sur la liste le bouton pivoter ne s'efface plus. Je ne comprend pas pourquoi ? Y'a t'il une erreur dans ce code je pense que se problème doit avoir un rapport avec le miens.

    Merci.

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

    On peut reproduire cela plus simplement.
    Lancez la console Python et prenez le temps de regardez le texte du Label avant et après l'appel à destroy.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import tkinter as tk
    >>> for x in range(2):
    ...     label = tk.Label(text='label-%d' % x)
    ...     label.grid(row=0, column=0)
    ...
    >>> label.destroy()
    >>>
    Normalement, vous devriez comprendre la cause du problème.

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

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Je ne dois pas comprendre ce que vous essayez de me dire.. J'ai fais un label.cget("text") dans la boucle pour lire le contenu des label je vois bien label-1 puis le label-2, et après le destroy(), ou j'ai le message d'erreur comme quoi le label n'existe plus. Mais je ne vois pas le rapport avec le code du dessus, pourriez vous m'éclaircir ? Merci.

    Citation Envoyé par wiztricks Voir le message
    Salut,

    On peut reproduire cela plus simplement.
    Lancez la console Python et prenez le temps de regardez le texte du Label avant et après l'appel à destroy.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import tkinter as tk
    >>> for x in range(2):
    ...     label = tk.Label(text='label-%d' % x)
    ...     label.grid(row=0, column=0)
    ...
    >>> label.destroy()
    >>>
    Normalement, vous devriez comprendre la cause du problème.

    - W

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

    Citation Envoyé par Romaiiiiiin Voir le message
    Si quand on lance l'app et que l'on clique une fois sur la liste puis sur supprimé tout s'efface bien, mais a partir du moment ou l'on clique plus d'une fois sur la liste le bouton pivoter ne s'efface plus.
    Je ne comprend pas pourquoi
    Lorsque vous cliquez plusieurs fois, le callback "SelectBateau" aura créé autant de Button.
    Les widgets seront "empilés" les uns au dessus des autres dans la case (5, 0) de votre "grid".
    L'attribut "buttonChangeOrt" ne mémorise que le dernier widget créé.
    Lorsque dans "Sup" le widget associé est détruit, on voit celui d'en dessous.

    C'est le comportement que reproduit mon petit programme.

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

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    En effet ça parait logique, comment n'y ais-je pas pensé ..

    Merci.

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

Discussions similaires

  1. [XL-2013] impossible de supprimer des Items dans une listbox à choix multiple
    Par dmoluc dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/11/2013, 16h34
  2. [AC-2003] Selection impossible dans une Listbox
    Par nawakbling dans le forum IHM
    Réponses: 2
    Dernier message: 19/02/2010, 10h11
  3. Réponses: 3
    Dernier message: 25/03/2004, 11h35
  4. [debutant][servlet]erreur causée par une listBox
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/03/2004, 10h53
  5. Icône a coté du texte dans une ListBox
    Par joce3000 dans le forum C++Builder
    Réponses: 6
    Dernier message: 05/12/2003, 02h25

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