Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POO] Aide exercice de Swinnen

Sujet résolu
24 décembre 2010 à 19:37:13

Bonjours.

Donc j'ai un exercice:

"
Écrivez un script qui créera deux classes : une classe « Application », dérivée de Frame(), dont le constructeur instanciera un canevas de 400x400 pixels, ainsi que deux boutons. Dans le canevas, vous instancierez un objet de la classe « Visage » décrite ci-après. La classe « Visage » servira à définir des objets graphiques censés représenter des visages humains simplifiés. Ces visages seront constitués d'un cercle principal dans lequel trois ovales plus petits représenteront deux yeux et une bouche (ouverte). Une méthode "fermer" permettra de remplacer l'ovale de la bouche par une ligne horizontale. Une méthode « ouvrir » permettra de restituer la bouche de forme ovale. Les deux boutons définis dans la classe « Application » serviront respectivement à fermer et à ouvrir la bouche de l'objet « Visage » installé dans le canevas.
"

Niveau POO y'a pas de problème... Mais cette ligne me chiffone:

Citation

Dans le canevas, vous instancierez un objet de la classe « Visage » décrite ci-après.



Quel objet? Avec quel attribut? :-°

Pour être franc, je me sert de moins en moins du canevas :p
Donc comment je peut faire pour "instancier un objet dans le canevas"?

Moi le canevas je l'aurais mis dans la classe "Visage", ça aurais eu le mérite d'être plus simple...

  • Partager sur Facebook
  • Partager sur Twitter
27 décembre 2010 à 17:59:56

Citation

Niveau POO y'a pas de problème... Mais cette ligne me chiffone:


Citation
Dans le canevas, vous instancierez un objet de la classe « Visage » décrite ci-après.

Quel objet? Avec quel attribut?
Pour être franc, je me sert de moins en moins du canevas
Donc comment je peut faire pour "instancier un objet dans le canevas"?



Si j'ai bien compris la question, il faut que dans ta classe Visage tu attribue un parametre pour déterminer le "boss" de ton objet comme tu hiérarchise les autres widgets !

Citation

Moi le canevas je l'aurais mis dans la classe "Visage", ça aurais eu le mérite d'être plus simple...



Pour une app basic comme celle la oui c'est plus simple, mais le but de l'exercice est de créer du code réutilisable que tu peut instancier dans d'autres applis ou instancier plusieurs fois dans la meme appli !
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2010 à 5:42:39

J'ai pas bien compris dsl...
C'est quoi le "boss" de l'objet?

Je suis complètement pomé pour le canvas...
Voici le code minimal en construction...

from tkinter import*

class APPLICATION(Frame):
    def __init__(self, larg= 400, haut= 400):
        Frame.__init__(self)
        visage = VISAGE()
               
        can = Canvas(width= larg, height= haut, ).pack()
        can.creat_ligne(visage.ligne)
        
        self.bouton1 = Button(text= 'OuVrir',  command= visage.Ouvrir).pack()
        self.bouton2 = Button(text= 'ferMeR', command= visage.Fermer).pack()
        
        

class VISAGE():
    def __init__(self, maitre= None):
       self.ligne = (30, 30, 30, 30)

    def Ouvrir(self):
        print('test')

    def Fermer(self):
        print('test')


if __name__ == "__main__":
    fen = Tk()
    application = APPLICATION()
    fen.mainloop()
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2010 à 9:40:17

Je viens de le faire, pour moi ça donne ça !

#!/usr/bin/python
#-*- coding: UTF-8 -*-

# Exercice 13.21

from tkinter import *

class Visage(object):
    """Visage basic a base de cercles"""
    def __init__(self, boss):
        "initialisation du visage"
        self.boss = boss # recuperation du parametre boss dans une variable !
        self.cercle(200, 200, 160, "red") #Visage
        self.cercle(140, 140, 30, "blue") # Oeil gauche
        self.cercle(260, 140, 30, "blue") # Oeil droit
        self.cercle(200, 190, 30, "purple") # Nez
        # Création de la bouche qui est affectée a une variable !
        self.bouche = self.boss.create_oval(140, 230, 260, 350, outline
                                            ="pink", width=3) # Bouche

    def cercle(self, x, y, r, coul="black"):
        "création des cercles de != tailles et couleur"
        self.boss.create_oval(x-r, y-r, x+r, y+r, outline=coul, width=3)

    def ouverte(self):
        "Modification de la bouche en position ouverte"
        self.boss.coords(self.bouche, 140, 230, 260, 350)

    def fermee(self):
        "Modification de la bouche en position fermée"
        self.boss.coords(self.bouche, 140, 290, 260, 290)


class Application(Frame):
    """Création de la fenetre de l'application et 2 boutons"""
    def __init__(self):
        "initialisation de la fenetre"
        Frame.__init__(self)
        self.can = Canvas(width=400, height=400, bg="light yellow")
        self.can.pack(padx=20, pady=20)
        perso = Visage(self.can) # self.can est le boss de visage !!!
        Button(text="Bouche ouverte", command=perso.ouverte).pack(side=RIGHT)
        Button(text="Bouche fermée", command =perso.fermee).pack(side=LEFT)

if __name__ == "__main__":
    Application().mainloop()


Les lighes importantes sont:
La ligne 10 ou il faut attribuer un parametre "boss" au constructeur de la classe Visage()
La ligne 12 qui récupère ce paramètreet l'affecte a une variable globale
La lighe 41 ou on crée une une instance de la classe Visage() avec comme paramètre "boss" self.can qui est le canvas de la classe Application()

Le reste c'est du déjà vu ;)
  • Partager sur Facebook
  • Partager sur Twitter
30 décembre 2010 à 3:56:44

merci beaucoup, c'est beaucoup plus clair !!
(J'ai juste lu les lignes de ton expliquation pour pas me spoiler ;) )

Mais c'est quoi le paramètre boss?
  • Partager sur Facebook
  • Partager sur Twitter
30 décembre 2010 à 8:32:24

Citation

Mais c'est quoi le paramètre boss?



quand tu créer un cercle dans un canvas, admetons que tu appele ton canva "can" tu éctit:

can.create_oval(parametres ...)
Tu est obliger de désigner "où" va etre placer ton cercle en l'occurence dans "can" ici ...

Mais si tu veut faire une serie de cercle que tu veut mettre dans une classe tu n'as pas nécéssairement le nom du canva ...
donc le mieux c'est de créer un parametre dans ta classe qui permettra de choisir le canva ou sera placer la serie de cercles
je l'ai appelé boss comme j'aurais pu l'appeler alfred ;) mais au lieux d'écrire:
can.create_oval(parametres ...), j'écrit boss.create_oval(parametres ...)

Dans mon exemple j'ai créer un parametre "boss", j'ai créer une variable globale qui s'appele self.boss pour pouvoir l'utiliser dans toute ma classe (lignes 23, 27, 31).

@ +++
  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2011 à 0:01:06

Bonjour,

@Darioo2:
Merci pour ton code qui m'a permi d'y voir plus clair! Cependant il reste quelques zones d'ombre: pourquoi utilises tu "object" pour la classe "Visage"? Ca n'a pas l'air d'être une classe parente et apparemment, ce n'est pas nécessaire dans le code...peux-tu m'éclairer à ce sujet?

Merci d'avance.
  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2011 à 0:44:23

Tranquille pépère le message.
  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2011 à 9:12:58

Citation : pieral85

Bonjour,

@Darioo2:
Merci pour ton code qui m'a permi d'y voir plus clair! Cependant il reste quelques zones d'ombre: pourquoi utilises tu "object" pour la classe "Visage"? Ca n'a pas l'air d'être une classe parente et apparemment, ce n'est pas nécessaire dans le code...peux-tu m'éclairer à ce sujet?

Merci d'avance.



On appelle ça les classes de new-style. En python, toute classe est object et toutes doit donc hérité directement ou indirectement de la classe object. Bref, quand une classe n'a aucun parent, tu la fait hérité d'object. Par ailleur, il est rigoureux de garder une référence à un widget parent quand on travaille sur des interfaces graphiques
  • Partager sur Facebook
  • Partager sur Twitter