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

GUI Python Discussion :

Détruire une classe


Sujet :

GUI Python

  1. #1
    Membre régulier
    Femme Profil pro
    étudiant master
    Inscrit en
    Février 2014
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant master

    Informations forums :
    Inscription : Février 2014
    Messages : 164
    Points : 100
    Points
    100
    Par défaut Détruire une classe
    salut,

    quelle est la fonction qu'elle peut m'aider à détruire une classe avec l'appel d'une autre classe?
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    classe1(Frame):
       ......
    classe2(Frame):
      ........
    classe(Toplevel):
    ...
       def affich1(self):
             self.Frame=classe1(self)       #appel de la classe1
       def affich2(self):
             self.Frame=classe2(self)        #appel de la classe2
    RQ: les widgets des deux classes 1 et 2 sont affichés à la même fenêtre toplevel
    ça fonctionne bien, mais quand je veux retourner à l'autre classe(par exemple du 1 à 2),je suis obliger de fermer la fenêtre top et l'ouvrir à nouveau


    merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par noramokh Voir le message
    salut,

    quelle est la fonction qu'elle peut m'aider à détruire une classe avec l'appel d'une autre classe?
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    classe1(Frame):
       ......
    classe2(Frame):
      ........
    classe(Toplevel):
    ...
       def affich1(self):
             self.Frame=classe1(self)       #appel de la classe1
       def affich2(self):
             self.Frame=classe2(self)        #appel de la classe2
    RQ: les widgets des deux classes 1 et 2 sont affichés à la même fenêtre toplevel
    ça fonctionne bien, mais quand je veux retourner à l'autre classe(par exemple du 1 à 2),je suis obliger de fermer la fenêtre top et l'ouvrir à nouveau


    merci d'avance
    Bonjour,

    Est-ce que vous ne confondez pas détruire un widget (widget.destroy()) avec détruire sa classe ?

    Etes-vous sûre d'avoir besoin de "détruire" un widget ? Ne cherchez-vous pas simplement à afficher / masquer des widgets selon le besoin ?

    Vous m'aviez déjà fait cette erreur et je vous avais déjà montré comment "switcher" entre l'affichage de plusieurs widgets à un même endroit.

    Souvenez-vous :

    c'était ici http://www.developpez.net/forums/d14...e/#post7833853

    et là http://www.developpez.net/forums/d14...e/#post7835148

    Bonne (re)lecture.

    @+.

  3. #3
    Membre régulier
    Femme Profil pro
    étudiant master
    Inscrit en
    Février 2014
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant master

    Informations forums :
    Inscription : Février 2014
    Messages : 164
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Bonjour,

    Est-ce que vous ne confondez pas détruire un widget (widget.destroy()) avec détruire sa classe ?

    Etes-vous sûre d'avoir besoin de "détruire" un widget ? Ne cherchez-vous pas simplement à afficher / masquer des widgets selon le besoin ?

    Vous m'aviez déjà fait cette erreur et je vous avais déjà montré comment "switcher" entre l'affichage de plusieurs widgets à un même endroit.

    Souvenez-vous :

    c'était ici http://www.developpez.net/forums/d14...e/#post7833853

    et là http://www.developpez.net/forums/d14...e/#post7835148

    Bonne (re)lecture.

    @+.
    oui c'est vrai, j'ai réussi à switcher entre des widgets dans la même classe, hier j'ai tenté de le faire avec des widgets mais dans des classes différents et ça marche pas chez moi.....
    en fait, ce que je voulais:

    1. appel classe1(affichage des widgets dans classe())
    2.détruire ces widgets
    3. appel classe2(affichage des widgets dans classe())

    sans fermer fenêtre et l'ouvrir à nouveau pour afficher les widgets de l'autre classe

    j'espère que vous me comprenez

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par noramokh Voir le message
    oui c'est vrai, j'ai réussi à switcher entre des widgets dans la même classe, hier j'ai tenté de le faire avec des widgets mais dans des classes différents et ça marche pas chez moi.....
    en fait, ce que je voulais:

    1. appel classe1(affichage des widgets dans classe())
    2.détruire ces widgets
    3. appel classe2(affichage des widgets dans classe())

    sans fermer fenêtre et l'ouvrir à nouveau pour afficher les widgets de l'autre classe

    j'espère que vous me comprenez
    Oui, c'est bien le même principe.

    Vos classes enveloppent des widgets Frame pour y implémenter des widgets dedans.

    Mais au final, vous voulez "switcher" des Frames dans votre Toplevel() => c'est donc bien exactement le même mécanisme que celui que je vous avais montré dans la méthode switch_to()

    Souvenez-vous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        def switch_to (self, content):
            "basculer vers un autre contenu"
            for widget in self.mainframe.winfo_children():
                widget.pack_forget()
            # end for
            # on affiche le nouveau contenu
            content.pack(expand=1, fill=BOTH, in_=self.mainframe)
        # end def
    Il vous suffit simplement de remplacer self.mainframe qui était le conteneur de widgets de l'époque par self qui représente la fenêtre Toplevel() que vous utilisez actuellement et qui est votre conteneur de widgets actuel.

    Exemple :

    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
    class classe1 (Frame):
        pass
    # end class classe1
     
    class classe2 (Frame):
        pass
    # end class classe2
     
    class classe (Toplevel):
     
        def __init__ (self):
            # superclass inits
            Toplevel.__init__(self)
            # init classes 1 et 2
            self.frame1 = classe1(self)
            self.frame2 = classe2(self)
        # end def
     
        def affich1 (self):
            self.switch_to(self.frame1)
        # end def
     
        def affich2 (self):
            self.switch_to(self.frame2)
        # end def
     
        def switch_to (self, content):
            "basculer vers un autre contenu"
            for widget in self.winfo_children():
                widget.pack_forget()
            # end for
            # on affiche le nouveau contenu
            content.pack(expand=1, fill=BOTH, in_=self)
        # end def
     
    # end class classe
    Vous voyez ce que je veux dire ?

    @+.

  5. #5
    Invité
    Invité(e)
    Par défaut Exemple de code fonctionnel
    Tenez, voici un exemple de code fonctionnel pour mieux comprendre comment faire :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
     
    class classe1 (Frame):
     
        def __init__ (self, master=None, **kw):
            # superclass inits
            Frame.__init__(self, master, **kw)
            # member inits
            self.master = master
            # widget inits
            self.init_widget()
        # end def
     
        def init_widget (self):
            "init contenu no. 1"
            Label(self, text="Ceci est le contenu no. 1").pack()
            Button(self, text="Aller au contenu 2 >>", command=self.master.affich2).pack()
        # end def
     
    # end class classe1
     
     
    class classe2 (Frame):
     
        def __init__ (self, master=None, **kw):
            # superclass inits
            Frame.__init__(self, master, **kw)
            # member inits
            self.master = master
            # widget inits
            self.init_widget()
        # end def
     
        def init_widget (self):
            "init contenu no. 2"
            Label(self, text="Ceci est le contenu no. 2").pack()
            Button(self, text="<< Retourner au contenu 1", command=self.master.affich1).pack()
        # end def
     
    # end class classe2
     
     
    class classe (Toplevel):
     
        def __init__ (self):
            # superclass inits
            Toplevel.__init__(self)
            # init classes 1 et 2
            self.frame1 = classe1(self)
            self.frame2 = classe2(self)
            # on commence par afficher le contenu no. 1:
            self.affich1()
        # end def
     
        def affich1 (self):
            self.switch_to(self.frame1)
        # end def
     
        def affich2 (self):
            self.switch_to(self.frame2)
        # end def
     
        def switch_to (self, content):
            "basculer vers un autre contenu"
            for widget in self.winfo_children():
                widget.pack_forget()
            # end for
            # on affiche le nouveau contenu
            content.pack(expand=1, fill=BOTH, in_=self, padx=5, pady=5)
        # end def
     
    # end class classe
     
     
    if __name__ == "__main__":
     
        classe().mainloop()
     
    # end if
    Bon courage.

    @+.

  6. #6
    Membre régulier
    Femme Profil pro
    étudiant master
    Inscrit en
    Février 2014
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant master

    Informations forums :
    Inscription : Février 2014
    Messages : 164
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    Tenez, voici un exemple de code fonctionnel pour mieux comprendre comment faire :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
     
    class classe1 (Frame):
     
        def __init__ (self, master=None, **kw):
            # superclass inits
            Frame.__init__(self, master, **kw)
            # member inits
            self.master = master
            # widget inits
            self.init_widget()
        # end def
     
        def init_widget (self):
            "init contenu no. 1"
            Label(self, text="Ceci est le contenu no. 1").pack()
            Button(self, text="Aller au contenu 2 >>", command=self.master.affich2).pack()
        # end def
     
    # end class classe1
     
     
    class classe2 (Frame):
     
        def __init__ (self, master=None, **kw):
            # superclass inits
            Frame.__init__(self, master, **kw)
            # member inits
            self.master = master
            # widget inits
            self.init_widget()
        # end def
     
        def init_widget (self):
            "init contenu no. 2"
            Label(self, text="Ceci est le contenu no. 2").pack()
            Button(self, text="<< Retourner au contenu 1", command=self.master.affich1).pack()
        # end def
     
    # end class classe2
     
     
    class classe (Toplevel):
     
        def __init__ (self):
            # superclass inits
            Toplevel.__init__(self)
            # init classes 1 et 2
            self.frame1 = classe1(self)
            self.frame2 = classe2(self)
            # on commence par afficher le contenu no. 1:
            self.affich1()
        # end def
     
        def affich1 (self):
            self.switch_to(self.frame1)
        # end def
     
        def affich2 (self):
            self.switch_to(self.frame2)
        # end def
     
        def switch_to (self, content):
            "basculer vers un autre contenu"
            for widget in self.winfo_children():
                widget.pack_forget()
            # end for
            # on affiche le nouveau contenu
            content.pack(expand=1, fill=BOTH, in_=self, padx=5, pady=5)
        # end def
     
    # end class classe
     
     
    if __name__ == "__main__":
     
        classe().mainloop()
     
    # end if
    Bon courage.

    @+.
    bonjour,

    merci beaucoup tarball69, ça fonctionne bien chez moi. juste une dernière question avant de mettre la discussion résolue:

    à quoi sert le paramètre (**kw) dans cet exemple?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par noramokh Voir le message
    bonjour,

    merci beaucoup tarball69, ça fonctionne bien chez moi. juste une dernière question avant de mettre la discussion résolue:

    à quoi sert le paramètre (**kw) dans cet exemple?
    C'est une notation Python pour l'expansion d'arguments nommés optionnels (keywords - e.g. bg="red", width=100, etc).

    Au lieu de citer chaque paramètre optionnel un à un, on utilise cette notation anonyme **kw, **keywords ou **options si vous préférez.

    La variable kw, keywords ou options contiendra un dictionnaire Python dict() avec les paramètres nommés optionnels, si on en passe ou un dictionnaire vide sinon.

    Dans notre cas ici présent, supposons que vous vouliez paramétrer votre classe classe1 qui dérive d'une tkinter.Frame pour lui imposer un fond rouge, une largeur de 100 pixels et une hauteur de 150 pixels, vous écririez dès lors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.frame1 = classe1(self, bg="red", width=100, height=150)
    dans ce cas, le paramètre kw vaudra kw = dict(bg="red", width=100, height=150) et sera développé comme tel durant l'init de l'ancêtre Frame de classe1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __init__ (self, master=None, **kw):
            # superclass inits
            Frame.__init__(self, master, **kw)
    Il s'agit ni plus ni moins que d'une notation anonyme d'arguments de fonction nommés optionnels.

    @+.

  8. #8
    Membre régulier
    Femme Profil pro
    étudiant master
    Inscrit en
    Février 2014
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant master

    Informations forums :
    Inscription : Février 2014
    Messages : 164
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    C'est une notation Python pour l'expansion d'arguments nommés optionnels (keywords - e.g. bg="red", width=100, etc).

    Au lieu de citer chaque paramètre optionnel un à un, on utilise cette notation anonyme **kw, **keywords ou **options si vous préférez.

    La variable kw, keywords ou options contiendra un dictionnaire Python dict() avec les paramètres nommés optionnels, si on en passe ou un dictionnaire vide sinon.

    Dans notre cas ici présent, supposons que vous vouliez paramétrer votre classe classe1 qui dérive d'une tkinter.Frame pour lui imposer un fond rouge, une largeur de 100 pixels et une hauteur de 150 pixels, vous écririez dès lors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.frame1 = classe1(self, bg="red", width=100, height=150)
    dans ce cas, le paramètre kw vaudra kw = dict(bg="red", width=100, height=150) et sera développé comme tel durant l'init de l'ancêtre Frame de classe1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __init__ (self, master=None, **kw):
            # superclass inits
            Frame.__init__(self, master, **kw)
    Il s'agit ni plus ni moins que d'une notation anonyme d'arguments de fonction nommés optionnels.

    @+.


    à+

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

Discussions similaires

  1. [PHP 5.2] Détruire une classe (et non une instance)
    Par Halleck dans le forum Langage
    Réponses: 5
    Dernier message: 06/02/2010, 09h54
  2. Détruire une instance d'une classe
    Par joy84 dans le forum JSF
    Réponses: 6
    Dernier message: 03/12/2009, 09h38
  3. Réponses: 2
    Dernier message: 17/03/2008, 10h58
  4. Détruire une classe
    Par Shredder dans le forum Langage
    Réponses: 5
    Dernier message: 05/11/2007, 00h35
  5. Détruire une classe
    Par HeyItsIan dans le forum Langage
    Réponses: 4
    Dernier message: 25/01/2007, 23h11

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