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

Python Discussion :

python: code en classes


Sujet :

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 python: code en classes
    bonjour,

    comment peut on appeler une classe à partir d'une autre?

    le code suivant est un code simplifié d'un autre code plus long, pour pouvoir comprendre mon problème:

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
     
    import Tkinter
    from Tkinter import *
    import Tix
    from Tix import *
    from ttk import *
     
     
    class Trimestre(Frame):
        def __init__(self):
            Frame.__init__(self)
     
            def var4(evt):
                global v4
                v4=varcombo4.get()
                print v4
     
            self.labelframe=LabelFrame(self,text="Requêtes par Trimestre ",height=200,width=200)
            self.labelframe.grid(row=1,columnspan=3,padx=10,pady=10,sticky=NW)
     
            txt2=Label(self.labelframe, text='Trimestre :')
            txt2.grid(row=3,pady=10,sticky=NW)
     
            varcombo4 = Tix.StringVar()
            combo4 = Tix.ComboBox(self.labelframe, editable=1, dropdown=1,variable=varcombo4, command = var4)
            combo4.entry.config(state='readonly')  ## met la zone de texte en lecture seule
            combo4.insert(1, '1')
            combo4.insert(2, '2')
            combo4.insert(3, '3')
            combo4.insert(4, '4')
            combo4.grid(row=3,column=1,columnspan=2,pady=10,padx=5,sticky=NW)
     
    class statistiques (Toplevel):
     
        def __init__(self,boss,**Arguments):
            Toplevel.__init__(self,boss,**Arguments)
            self.title("Statistiques ")
            self.geometry('500x350')
            self.resizable(0,0)
            self.initialize()
     
        def initialize (self):
     
            self.grid()
     
     
            # definition des menus    
            menubar = Menu(self)
     
            prodmenu=Menu(menubar,tearoff=0)
            prodmenu.add_command(label='Trimestre', command=self.exeT)
            prodmenu.add_command(label='Année ', command=None)
            menubar.add_cascade(label='Production', menu=prodmenu)
            self.config(menu = menubar)
     
        def exeT(self):
     
            self.Frame=Trimestre()
     
     
    class consultation(Toplevel):
     
        def __init__(self,boss,**Arguments):
     
            Toplevel.__init__(self,boss,**Arguments)
            self.geometry('500x350')
            self.resizable(0,0)
            self.title("Consultation des statistiques agricoles de la wilaya de ")
            self.initialize()
     
        def initialize(self):
     
            self.grid()
     
            appliquer=Button(self,text='Suivant', command=self.appliquer)
            appliquer.grid(row=6,column=3,pady=10,sticky=E)
     
        def appliquer (self):
            self.fen2=statistiques(self)
     
    class ChoixWilayas(Tix.Tk):
     
        def __init__(self,parent):
     
            Tix.Tk.__init__(self,parent)
            self.parent=parent
            self.geometry('240x90')    
            self.initialize()
     
        def initialize(self):
     
            self.grid()
     
            ok=Button(self,text='Entrer ', command=self.ok)
            ok.grid(row=4,column=1,pady=10,sticky=E)
     
     
     
     
        def ok (self):
            self.fen1=consultation(self)
     
     
     
    if __name__ == "__main__":
     
        app = ChoixWilayas(None)
        app.title('Choix de la Wilayas')
     
        app.mainloop()


    afin d'afficher les widgets de la classe 'Trimestre' dans la même fenêtre de la classe 'statistiques' après qu'on clic sur le menu 'trimestre'.

    Est ce que c'est faisable?

    j'espère que j'aurai un aide. merci

  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,

    Votre code est excessivement compliqué pour pas grand chose.

    Ceci dit, statistiques est une Toplevel.
    Si vous voulez que Trimestre (qui est Frame) s'affiche dans cette Toplevel, il suffit de le préciser en "master".
    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
    import tkinter as tk
     
    def create_frame(master=None, color='blue'):
        frame = tk.Frame(master, width=100, height=100, bg=color)
        return frame
     
    app = tk.Tk()
    f1 = create_frame() # dans app
    f1.pack()
     
    toplevel = tk.Toplevel(app)
    f2 = create_frame(toplevel, color='red') # dans toplevel
    f2.pack()
     
    tk.mainloop()
    Pas besoin de 100 lignes de code pour le tester... ni de construire des s/classes de Tk, Toplevel, Frame,...

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

  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 wiztricks Voir le message
    Salut,

    Votre code est excessivement compliqué pour pas grand chose.

    Ceci dit, statistiques est une Toplevel.
    Si vous voulez que Trimestre (qui est Frame) s'affiche dans cette Toplevel, il suffit de le préciser en "master".
    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
    import tkinter as tk
     
    def create_frame(master=None, color='blue'):
        frame = tk.Frame(master, width=100, height=100, bg=color)
        return frame
     
    app = tk.Tk()
    f1 = create_frame() # dans app
    f1.pack()
     
    toplevel = tk.Toplevel(app)
    f2 = create_frame(toplevel, color='red') # dans toplevel
    f2.pack()
     
    tk.mainloop()
    Pas besoin de 100 lignes de code pour le tester... ni de construire des s/classes de Tk, Toplevel, Frame,...

    - W

    mon code principal contient toute ces classes, et chaque classes se compose de plusieurs widgets et fonctions. donc je ne peux pas procéder comme vous m'avez indiquer.
    je voulais créer cette classe (trimestre) pour le code sera plus organisés.

    merci

  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 noramokh Voir le message
    mon code principal contient toute ces classes, et chaque classes se compose de plusieurs widgets et fonctions. donc je ne peux pas procéder comme vous m'avez indiquer.
    je voulais créer cette classe (trimestre) pour le code sera plus organisés.
    Votre question était:
    afficher les widgets de la classe 'Trimestre' dans la même fenêtre de la classe 'statistiques' après qu'on clic sur le menu 'trimestre'.
    Ce qui se résume à afficher l'instance d'une Frame dans l'instance d'un Toplevel.
    Techniquement, la réponse consiste à appeler un callable avec un paramètre.
    Ce callable peut être fonction, méthode, constructeur d'une classe et ce paramètre n'importe quel objet.

    Si vous essayez de comprendre "comment" çà fonctionne, il ne devrait pas être compliqué d'adapter votre code.

    Ajouter des classes utilisateurs n'apporte que des lignes en plus pour pas grand chose:
    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
    import tkinter as tk
     
    class MyFrame(tk.Frame):
        def __init__(self, master=None, color='blue'):
           super().__init__(master, width=100, height=100, bg=color)
     
    class MyToplevel(tk.Toplevel):
        def __init__(self, master=None):
            super().__init__(master)
     
    app = tk.Tk()
    f1 = MyFrame()
    f1.pack()
     
    window = MyToplevel(app)
    f2 =  MyFrame(window, color='red')
    f2.pack()
     
    tk.mainloop()
    Après on pourrait aussi appeler "statistiques" la classe MyToplevel et "trimestre" la classe MyFrame.
    Puis déplacer l'appel à la création de MyFrame dans une méthode de MyToplevel qui sera activée par un Button.
    Ca complique le contexte sans apporter grand chose côté "comment réaliser le comportement attendu avec ces widgets Tkinter".
    Si vous voulez que votre application fonctionne, ce sont eux qu'il vous faut apprendre à utiliser.
    L'emballage dans lequel vous les avez empaquetés pour vos besoins n'a pas grande importance.

    On pourrait faire encore plus succinct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
     
    app = tk.Tk()
    tk.Frame(width=100, height=100, bg='blue').pack()
     
    window = tk.Toplevel(app)
    tk.Frame(window, width=100, height=100, bg='red').pack()
     
    tk.mainloop()
    La seule chose à comprendre est le paramètre qu'on doit passer ("window") pour que la Frame se crée "dans" la Toplevel.
    Si votre code ne tient pas compte de ce détail là, il ne fonctionnera pas comme vous le voulez.

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

  5. #5
    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 wiztricks Voir le message
    Votre question était:

    Ce qui se résume à afficher l'instance d'une Frame dans l'instance d'un Toplevel.
    Techniquement, la réponse consiste à appeler un callable avec un paramètre.
    Ce callable peut être fonction, méthode, constructeur d'une classe et ce paramètre n'importe quel objet.

    Si vous essayez de comprendre "comment" çà fonctionne, il ne devrait pas être compliqué d'adapter votre code.

    Ajouter des classes utilisateurs n'apporte que des lignes en plus pour pas grand chose:
    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
    import tkinter as tk
     
    class MyFrame(tk.Frame):
        def __init__(self, master=None, color='blue'):
           super().__init__(master, width=100, height=100, bg=color)
     
    class MyToplevel(tk.Toplevel):
        def __init__(self, master=None):
            super().__init__(master)
     
    app = tk.Tk()
    f1 = MyFrame()
    f1.pack()
     
    window = MyToplevel(app)
    f2 =  MyFrame(window, color='red')
    f2.pack()
     
    tk.mainloop()
    Après on pourrait aussi appeler "statistiques" la classe MyToplevel et "trimestre" la classe MyFrame.
    Puis déplacer l'appel à la création de MyFrame dans une méthode de MyToplevel qui sera activée par un Button.
    Ca complique le contexte sans apporter grand chose côté "comment réaliser le comportement attendu avec ces widgets Tkinter".
    Si vous voulez que votre application fonctionne, ce sont eux qu'il vous faut apprendre à utiliser.
    L'emballage dans lequel vous les avez empaquetés pour vos besoins n'a pas grande importance.

    On pourrait faire encore plus succinct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
     
    app = tk.Tk()
    tk.Frame(width=100, height=100, bg='blue').pack()
     
    window = tk.Toplevel(app)
    tk.Frame(window, width=100, height=100, bg='red').pack()
     
    tk.mainloop()
    La seule chose à comprendre est le paramètre qu'on doit passer ("window") pour que la Frame se crée "dans" la Toplevel.
    Si votre code ne tient pas compte de ce détail là, il ne fonctionnera pas comme vous le voulez.

    - W

    j'ai mis Trimestre(Frame) dans le cadre d'essayé de régler le problème.
    autrement, je veux afficher les widgets de la classe trimestre dans la fenêtre de la classe statistiques.

    je n'ai pas compris! suivant ton code, le résultat 02 fenêtres séparées.

    en tout cas, je vais essayé de concentrer et comprendre

    désolé si je vous fatigue avec moi

  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
    Citation Envoyé par noramokh Voir le message
    j'ai mis Trimestre(Frame) dans le cadre d'essayé de régler le problème.
    autrement, je veux afficher les widgets de la classe trimestre dans la fenêtre de la classe statistiques.

    je n'ai pas compris! suivant ton code, le résultat 02 fenêtres séparées.
    On appelle Frame avec la Toplevel en argument.
    ligne 61:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def exeT(self):
     
            self.Frame=Trimestre(self)
    On passe l'argument comme master à l'instanciation de Frame:
    ligne 14:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Trimestre(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)

    Et voilà.

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

  7. #7
    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 wiztricks Voir le message
    On appelle Frame avec la Toplevel en argument.
    ligne 61:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def exeT(self):
     
            self.Frame=Trimestre(self)
    On passe l'argument comme master à l'instanciation de Frame:
    ligne 14:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Trimestre(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)

    Et voilà.

    - W
    en plus de ça, on ajoute master au widget de trimestre pour s'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
     
            labelframe=LabelFrame(master,text="Requêtes par Trimestre ",height=200,width=200)
            labelframe.grid(row=1,columnspan=3,padx=10,pady=10,sticky=NW)
    ça fonctionne bien, merci infiniment

    en fin je peux dire que mon problème est résolu


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

Discussions similaires

  1. Eclipse ne compile plus mon code en class
    Par dcvman dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 01/01/2011, 14h23
  2. Réponses: 19
    Dernier message: 28/09/2010, 18h30
  3. Python manuel de classes
    Par ryu sensei dans le forum 3D
    Réponses: 7
    Dernier message: 14/03/2007, 08h51
  4. approche objet en python...associer des classes.
    Par preacher_man dans le forum Général Python
    Réponses: 9
    Dernier message: 06/01/2006, 15h21
  5. [D7] Reprise d'un code D4 (Classe TAdvExcel inconnu)
    Par plante20100 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/08/2005, 09h20

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