l
'Rc               @   s  dJ Z d  d l Z e j dK k rc d  d l Ty$ d  d l m Z d  d l m Z Wq dL Z Yq Xn7 d  d l	 Ty d  d l Z d  d l Z Wn dL Z Yn Xd  Z
 d Z d Z d Z d Z i  a d	 a d  d d d d d
 g a dM \ a a d a dN a dL a d   Z d   Z d   Z d   Z d	 d d d d  Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# d d  Z$ d d  Z% d   Z& d d  Z' d   Z( d   Z) d   Z* d    Z+ d!   Z, d"   Z- d#   Z. d$   Z/ d%   Z0 d&   Z1 d'   Z2 d(   Z3 d)   Z4 d*   Z5 d+   Z6 d,   Z7 d-   Z8 d.   Z9 d/   Z: d0   Z; d1   Z< d d d2  Z= d3   Z> d d d  d  d d d d4  Z? d5   Z@ d6   ZA d7   ZB d8   ZC d aD d9   eE d:  D aF d;   ZG d<   ZH d=   ZI d>   ZJ d?   ZK eL d@ k rd  dA lM mN ZN d  dB lO mP ZP mQ ZQ mR ZR d  dC lS mT ZT e dD dE dF  eG   e3 dG eG  e3 dH eJ  e3 dI e   e5 d eK  e   n  d S(O   i    Ni   (   u   *(   u   Image(   u   ImageTki   i   i   u    i   u   blackc             C   s1   t  j d k r t d  n t t  j ?|  f d  S(   Ni   u   print(perr, file=sys.stderr)(   i   (   u   sysu   version_infou   evalu   printu   stderr(   u   perr(    (    u   cng.pyu   __erreur[   s    c               C   s   d a t j   d  S(   NT(   u   Trueu	   __the_endu   rootu   destroy(    (    (    u   cng.pyu	   __quittere   s    c             C   s   |  j  d k r d a d  S|  j |  j  k sL |  j |  j  k r |  j d k r |  j a t j d	 k r |  j t k r t |  j   q t d |  j d  q t j	 |  j  r t |  j   q t d |  j d  n t d |  j  d  d  S(
   Nu   Escapeu    i   u
   la touche u!    n'est associee a aucune fonctionu   touche speciale u    non prise en compteT(   i   (
   u   keysymu   Trueu	   __the_endu   charu   __curkeyu   sysu   version_infou   dico_touchesu   __erreuru   has_key(   u   event(    (    u   cng.pyu   __key_pressl   s    3	c             C   s}   |  j  d k ry |  j  t k ry |  j d k ry |  j t k ry |  j  |  j a a t |  j |  j k ry t |  j   qy n  d  S(   Ni    (   u   xu   lau   yu   hau   __curxu   __curyu
   __lboutonsu   num(   u   event(    (    u   cng.pyu   __button_release   s    <u   whitec             C   s   t    a | d k r= | d k r= t j   t j   a a n | | a a t j |   t j d d d d  t j
 d t  t j d t  t j d t  t d t d t d |  a t j   d S(	   u   ATTENTION : premiere instruction du programme
    creation et affichage de la fenetre graphique
    de nom pnom, de largeur pla et de hauteur pha
    u   widthu   heightu   WM_DELETE_WINDOWu   <Key>u   <ButtonRelease>u   bgNF(   u   Tku   rootu   Noneu   winfo_screenwidthu   winfo_screenheightu   lau   hau   titleu	   resizableu   Falseu   protocolu	   __quitteru   bindu   __key_pressu   __button_releaseu   Canvasu   canvu   pack(   u   pnomu   plau   phau   color(    (    u   cng.pyu   init_window   s    		c               C   s
   t  j   S(   N(   u   rootu   winfo_screenwidth(    (    (    u   cng.pyu   get_screen_width   s    c               C   s
   t  j   S(   N(   u   rootu   winfo_screenheight(    (    (    u   cng.pyu   get_screen_height   s    c               C   s   t  j   d S(   uV   ATTENTION : derniere instruction du programme
    boucle d'attente des evenements
    N(   u   rootu   mainloop(    (    (    u   cng.pyu	   main_loop   s    c               C   s   t  j d  d S(   u   efface l'ecran de travailu   allN(   u   canvu   delete(    (    (    u   cng.pyu   clear_screen   s    c              G   s  d a  t |   d k rE t |  d t  r8 |  d a  qt d  nt |   d k rt |  d t  rt |  d t  rt |  d t  rd d d g } t |  d  t |  d  t |  d  | d <| d <| d <d | d k  o d k  n rd | d k  od k  n rd | d k  o8d k  n rd a  xt t d  D]Y } | | d	 k  rt  d
 t | |  d d  7a  qPt  t | |  d d  7a  qPWqt d  qt d  n
 t d  d S(   u   Definition de la couleur courante
       - soit en r, v, b dans [O, 255]
       - soit par son nom (white, black, red, green, blue, ...)
    u   blacki   i    u2   [current_color] le paramètre n'est pas une chainei   i   i   u   #i   u   0Nu2   [current_color] composantes RVB pas entre 0 et 255u8   [current_color] l'un des paramètres n'est pas un entieru8   [current_color] nombre de paramètres incorrect (1 ou 3)iii(   u   __ccolu   lenu
   isinstanceu   stru   __erreuru   intu   rangeu   hex(   u   argsu   tcu   i(    (    u   cng.pyu   current_color   s$    9>`%%c               C   s   t  j   d S(   u$   refraichit l'ecran (force le dessin)N(   u   canvu   update_idletasks(    (    (    u   cng.pyu   refresh   s    c          
   C   sq   |  d k  s0 |  t  k s0 | d k  s0 | t k r= t d  n  t | } t j |  | |  d | d d t } | S(   u   affichage d'un point de coordonnees (px, py) dans la couleur courante
    retour de l'identificateur unique de l'objet cree
    i    u    [point] coordonnees hors fenetrei   u   fill(   u   lau   hau   __erreuru   canvu   create_lineu   __ccol(   u   pxu   pyu   id(    (    u   cng.pyu   point   s
    0
&c          	   C   s=   t  | t  | } } t j |  | | | d t d | } | S(   u   affichage d'un segment de sommets (px1, py1) et (px2, py2),
    d'epaisseur pep, dans la couleur courante
    retour de l'identificateur unique de l'objet cree
    u   fillu   width(   u   hau   canvu   create_lineu   __ccol(   u   px1u   py1u   px2u   py2u   pepu   id(    (    u   cng.pyu   line  s    $c          	   C   s=   t  | t  | } } t j |  | | | d t d | } | S(   u   affichage d'un rectangle dans la couleur courante
    defini par le sommet inf. gauche (px1, py1)
    et le sommet sup. droit (px2, py2) et d'epaisseur pep
    retour de l'identificateur unique de l'objet cree
    u   outlineu   width(   u   hau   canvu   create_rectangleu   __ccol(   u   px1u   py1u   px2u   py2u   pepu   id(    (    u   cng.pyu	   rectangle  s    $c          	   C   s=   t  | t  | } } t j |  | | | d t d d } | S(   u   affichage d'un rectangle plein dans la couleur courante
    defini par le sommet inf. gauche (px1, py1)
    et le sommet sup. droit (px2, py2)
    retour de l'identificateur unique de l'objet cree
    u   fillu   widthi    (   u   hau   canvu   create_rectangleu   __ccol(   u   px1u   py1u   px2u   py2u   id(    (    u   cng.pyu   box&  s    $c          	   C   sB   t  | } t j |  | | | |  | | | d t d | } | S(   u   affichage d'un cercle de centre (px, py), de rayon pr et d'epaisseur pep
    retour de l'identificateur unique de l'objet cree
    u   outlineu   width(   u   hau   canvu   create_ovalu   __ccol(   u   pxu   pyu   pru   pepu   id(    (    u   cng.pyu   circle3  s    
4c          	   C   sB   t  | } t j |  | | | |  | | | d t d d } | S(   ur   affichage d'un disque de centre (px, py) et de rayon pr
    retour de l'identificateur unique de l'objet cree
    u   fillu   widthi    (   u   hau   canvu   create_ovalu   __ccol(   u   pxu   pyu   pru   id(    (    u   cng.pyu   disc>  s    
4c              G   sy  t  |   d k r t |  d t  s8 t |  d t  r t  |  d  } d   t |  D } xO t |  D]A } | d d k r t |  d | | | <qk |  d | | | <qk Wt j | d t } qut	 d  n t  |   d k rkt  |   } d   t |  D } xG t |  D]9 } | d d k rAt |  | | | <q|  | | | <qWt j | d t } n
 t	 d  | S(	   u   affichage d'un polygone construit a partir d'une liste de coordonnees
    retour de l'identificateur unique de l'objet cree
    i   i    c             S   s   g  |  ] } d   q S(   i    (    (   u   .0u   i(    (    u   cng.pyu
   <listcomp>R  s   	 i   u   fillu6   [polygon] le parametre n'est pas une liste ou un tuplec             S   s   g  |  ] } d   q S(   i    (    (   u   .0u   i(    (    u   cng.pyu
   <listcomp>_  s   	 u   [polygon] parametre incorrect(
   u   lenu
   isinstanceu   listu   tupleu   rangeu   hau   canvu   create_polygonu   __ccolu   __erreur(   u   argsu   nbu   llu   iu   id(    (    u   cng.pyu   polygonI  s(    &
c          	   C   s2   t  | } t j |  | d | d t d d } | S(   u   affichage d'un texte pch a partir de la position (px, py) aligne a gauche
    retour de l'identificateur unique de l'objet cree
    u   textu   fillu   anchoru   sw(   u   hau   canvu   create_textu   __ccol(   u   pxu   pyu   pchu   id(    (    u   cng.pyu   textk  s    
$c             C   s   t  j |  d  S(   uY   retourne la couleur de fond de l'objet pid sous forme d'une
    chaine de caracteres
    u   fill(   u   canvu   itemcget(   u   pid(    (    u   cng.pyu   obj_get_colory  s    c             C   s   t  j |  d t d S(   uB   remplace la couleur de fond de l'objet pid par la couleur couranteu   fillN(   u   canvu   itemconfigureu   __ccol(   u   pid(    (    u   cng.pyu   obj_put_color  s    c                s   t  j |     t    } d } x.   f d   t |  D D] } | | 7} q> Wd } x.   f d   t |  D D] } | | 7} qu W| d } t | |  t | |  f S(   u_   retourne la position, au sens du centre geometrique, de l'objet pid
    en coordonnees entieresi    c                s*   g  |  ]  } | d  d k r   |  q S(   i   i    (    (   u   .0u   i(   u   lcoord(    u   cng.pyu
   <listcomp>  s   	 c                s*   g  |  ]  } | d  d k r   |  q S(   i   i   (    (   u   .0u   i(   u   lcoord(    u   cng.pyu
   <listcomp>  s   	 i   (   u   canvu   coordsu   lenu   rangeu   int(   u   pidu   lgu   xu   au   yu   bu   n(    (   u   lcoordu   cng.pyu   obj_get_position  s    ##
c             C   s   t  j |  | |  d S(   u:   deplacement relatif de l'objet graphique pid de (pdx, pdy)N(   u   canvu   move(   u   pidu   pdxu   pdy(    (    u   cng.pyu   obj_move  s    c             C   s   t  j |   d S(   u$   suppression de l'objet graphique pidN(   u   canvu   delete(   u   pid(    (    u   cng.pyu
   obj_delete  s    c             C   s   t  j |  d d d S(   u$   rendre visible l'objet graphique pidu   stateu   normalN(   u   canvu   itemconfigure(   u   pid(    (    u   cng.pyu   obj_show  s    c             C   s   t  j |  d d d S(   u&   rendre invisible l'objet graphique pidu   stateu   hiddenN(   u   canvu   itemconfigure(   u   pid(    (    u   cng.pyu   obj_hide  s    c             C   s   t  j |  |  d S(   uD   l'objet graphique pid1 s'affiche au dessus de l'objet graphique pid2N(   u   canvu	   tag_raise(   u   pid1u   pid2(    (    u   cng.pyu	   obj_above  s    c             C   s   | t  |  <d S(   u0   association d'une touche pt avec une fonction pfN(   u   dico_touches(   u   ptu   pf(    (    u   cng.pyu	   assoc_key  s    c               C   s   t  S(   u7   retourne le caractere correspondant a la touche pressee(   u   __curkey(    (    (    u   cng.pyu   get_key  s    c             C   s   | t  |  <d S(   u;   association d'un bouton pb (1, 2 ou 3) avec une fonction pfN(   u
   __lboutons(   u   pbu   pf(    (    u   cng.pyu   assoc_button  s    c               C   s   t  S(   u1   retourne la position en X du curseur de la souris(   u   __curx(    (    (    u   cng.pyu   get_mouse_x  s    c               C   s   t  t S(   u1   retourne la position en Y du curseur de la souris(   u   hau   __cury(    (    (    u   cng.pyu   get_mouse_y  s    c             C   s
   |  a  d  S(   N(   u   __idlef(   u   pfunc(    (    u   cng.pyu   init_idle_func  s    c               C   s.   t    t j   t s* t j d t  n  d  S(   Ni   (   u   __idlefu   canvu   updateu	   __the_endu   rootu   afteru	   idle_func(    (    (    u   cng.pyu	   idle_func  s    
c               C   s
   d a d  S(   NT(   u   Trueu	   __the_end(    (    (    u   cng.pyu	   idle_stop  s    c               C   s
   d a d  S(   NF(   u   Falseu	   __the_end(    (    (    u   cng.pyu
   idle_start  s    c               C   s   t  S(   N(   u	   __the_end(    (    (    u   cng.pyu	   idle_dead  s    c             C   s~   t  rP t j |   } | r7 | j | | f t j  n  t j |  } | | g St j d k rl t	 d  n
 t	 d  d Sd S(   u   
    retourne une image a placer, avec changement de taille si demande.
    ATTENTION : la reference a l'image doit etre *globale*.
    i   u    [image] module Pillow non chargeu   [image] module PIL non chargeN(   i   (   u   module_imageu   Imageu   openu	   thumbnailu	   ANTIALIASu   ImageTku
   PhotoImageu   sysu   version_infou   __erreuru   None(   u   nameu   widthu   heightu   imu   imp(    (    u   cng.pyu   image  s    

c             C   s`   t  r6 t | } t j |  | d | d d d } | St j d	 k rR t d  n
 t d  d S(
   u   
    place une image dans la fenetre par rapport a son centre
    pim : couple image pil, image tk
    retour de l'identificateur unique de l'objet cree
    u   imagei   u   anchoru   centeri   u    [image] module Pillow non chargeu   [image] module PIL non chargeN(   i   (   u   module_imageu   hau   canvu   create_imageu   sysu   version_infou   __erreur(   u   pxu   pyu   pimu   id(    (    u   cng.pyu
   image_draw  s    
"c       
   	   C   s_  t  r1t j |   } | j | | f t j | | | | | | d | | d f  } | t k rx | j t j  } n | t k r | j t j  } nc | t k r | j t j  } nB | t	 k r | j t j	  } n! | t
 k r | j t j
  } n  | r| j | | f  n  t j |  }	 | |	 f St j d k rMt d  n
 t d  d Sd S(   u	  
    retourne une image a partir d'une image regroupant plusieurs sous-images (sprites) avec possibilite de modifications simples (dilatations/symetries/rotations)
    transformation possible: FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, ROTATE_270
    i   i   u    [image] module Pillow non chargeu   [image] module PIL non chargeN(   i   (   u   module_imageu   Imageu   openu	   transformu   EXTENTu   FLIP_LEFT_RIGHTu	   transposeu   FLIP_TOP_BOTTOMu	   ROTATE_90u
   ROTATE_180u
   ROTATE_270u	   thumbnailu   ImageTku
   PhotoImageu   sysu   version_infou   __erreuru   None(
   u   nameu
   tile_widthu   tile_heightu   idx_xu   idx_yu   modifu   final_widthu   final_heightu   imu   imp(    (    u   cng.pyu   image_from_tiles  s*    B

c             C   s   | d k  r | d 7} n  |  d j  |  } t j |  |  d <t j |  \ } } t j |  t j | | d |  d d d } | S(   u   
    rotation *absolue* de l'image pid de pangle (en *degres*)
    cette transformation passe par PIL d'ou la necessite du parametre pim.
    Effet de bord : si l'image etait cachee, elle est a nouveau visible.
    i    ih  i   u   imageu   anchoru   center(   u   rotateu   ImageTku
   PhotoImageu   canvu   coordsu   deleteu   create_image(   u   pimu   pidu   pangleu   imu   xu   yu   id(    (    u   cng.pyu   image_rotate<  s    "c             C   s   |  d j  \ } } t | |  t | |  } } |  d j | | f t j  } t j |  |  d <t j |  \ } }	 t j	 |  t j
 | |	 d |  d d d }
 |
 S(   u   
    agrandissement (pfacteur > 1) ou reduction (pfacteur < 1) d'une image.
    Effet de bord : si l'image etait cachee, elle est a nouveau visible.
    i    i   u   imageu   anchoru   center(   u   sizeu   intu   resizeu   Imageu	   ANTIALIASu   ImageTku
   PhotoImageu   canvu   coordsu   deleteu   create_image(   u   pimu   pidu   pfacteuru   lu   hu   widthu   heightu   imu   xu   yu   id(    (    u   cng.pyu   image_scaleO  s    !"c             C   s   |  d j  \ } } t | |  t | |  } } |  d j | | f t j  } | d k  rl | d 7} n  | j |  } t j |  |  d <t j	 |  \ }	 }
 t j
 |  t j |	 |
 d |  d d d } | S(   u   
    agrandissement (pfacteur > 1) ou reduction (pfacteur < 1) d'une image
    associe a une rotation d'angle pangle (en *degres*).
    Effet de bord : si l'image etait cachee, elle est a nouveau visible.
    i    ih  i   u   imageu   anchoru   center(   u   sizeu   intu   resizeu   Imageu	   ANTIALIASu   rotateu   ImageTku
   PhotoImageu   canvu   coordsu   deleteu   create_image(   u   pimu   pidu   pangleu   pfacteuru   lu   hu   widthu   heightu   imu   xu   yu   id(    (    u   cng.pyu   image_transformationa  s    !"c             C   s   |  d j  | | f  S(   ub   
    retour de la valeur d'un pixel d'une image dont la reference est
    passee en parametre
    i   (   u   getpixel(   u   pimu   pxu   py(    (    u   cng.pyu	   get_pixely  s    c             C   s   g  |  ] } d  q S(   i   i(    (   u   .0u   i(    (    u   cng.pyu
   <listcomp>  s   	 i
   c               C   s   t  d  t d d d d  t d d d d  t  d  t d d d	  t d d d  t d d d  t d d d  t d d d  d  S(   Nu   greeni   iX  i   i   i(   u   blacki   u   AIDEi<   u   touche a : aideiP   u   touche z : trace les objetsid   u   touche e : efface l'ecranix   u   bouton gauche : iD  i  i0  i0  i0  i  i  i  i  (   u   current_coloru	   rectangleu   lineu   text(    (    (    u   cng.pyu   __aide  s    

c              C   sG   d }  x: t  d  D], } t d d d d |   t | <|  d 7}  q Wd  S(   Ngp=
ף@i   u   mago.pngi<   i   i   (   u   rangeu   image_from_tilesu   tim_mago(   u   yu   i(    (    u   cng.pyu   init_animation  s    c              C   s  xE t  d  D]7 }  t d d t |   } t   t d  t |  q Wt d d t d  } t   t d  t |  t d d t d  } t   t d  t |  t d d t d  } t   t d  t |  t d d t d  } t   t d  t |  d  S(	   Ni   i  i   g?i    i   i   i   (   u   rangeu
   image_drawu   tim_magou   refreshu   sleepu
   obj_delete(   u   iu   id(    (    u   cng.pyu	   animation  s*    







c        	   
   C   s  d4 }  t  d  x6 t d	 d
  D]% } t t d d  t d d   q  Wt  d  xN t d	 d  D]= } t t d d  t d d  t d d  t d d   qc Wt  d  xZ t d	 d  D]I } t t d d  t d d  t d d  t d d  t d	 d   q Wt  d  xB t d	 d  D]1 } t t d d  t d d  t d d   q%Wxe t d	 d  D]T } t  |  t d d   t t d d  t d d  t d d  t d d   qjWxY t d	 d  D]H } t  |  t d d   t t d d  t d d   t d d   qWt  d  t	 d d
 d d
 d
 d!  d d d d d d d d d d g
 } d" } xj t d  D]\ } d t
 | t d#  d
 | | d$ <d t | t d#  d% | | d$ d	 <| d& 7} qxWt  d  t	 |  d5 \ } } } t  d  d  } x2 t d*  D]$ } t d | | |  | d+ 8} qWd6 \ } } x= t d.  D]/ } t | | | |  | d/ | d0 } } qYWt d d- |  t d1  a t d2 d3 t  t   t t  t   d  S(7   Nu   redu   orangeu   yellowu   greenu   cyanu   blueu   purpleu   blacki   i   i   i   i,  i  i
   i   i   i  ir  i   i  i  i@  i|  i    i   i  ib  i<   id   i   i  i  g     V@g     f@i   i   iH   u   dansu   tous lesu   sensi   i   i"  i   i   i   i	   u	   ferme.pngi  i   (   u   redu   orangeu   yellowu   greenu   cyanu   blueu   purpleu   black(   u   dansu   tous lesu   sens(   i"  i   (   u   current_coloru   rangeu   pointu   randintu   lineu	   rectangleu   circleu   boxu   discu   polygonu   cosu   piu   sinu   textu   imageu   im1u
   image_drawu   init_animationu   init_idle_funcu	   animationu	   idle_func(	   u   lcoulu   iu   ll1u   angleu   mot1u   mot2u   mot3u   yu   x(    (    u   cng.pyu	   __figures  sZ    
#
;
G
/;/
$$(



c              C   s   t    t   }  } d  S(   N(   u   get_mouse_xu   get_mouse_y(   u   xu   y(    (    u   cng.pyu   __clic1  s    u   __main__(   u   randint(   u   cosu   sinu   pi(   u   sleepu   cng : test unitairei   iX  u   au   zu   eT(   i   F(   i    i    i(U   u   Trueu   module_imageu   sysu   version_infou   tkinteru   PILu   Imageu   ImageTku   Falseu   Tkinteru   FLIP_LEFT_RIGHTu   FLIP_TOP_BOTTOMu	   ROTATE_90u
   ROTATE_180u
   ROTATE_270u   dico_touchesu   __curkeyu
   __lboutonsu   __curxu   __curyu   __ccolu   __idlefu	   __the_endu   __erreuru	   __quitteru   __key_pressu   __button_releaseu   Noneu   init_windowu   get_screen_widthu   get_screen_heightu	   main_loopu   clear_screenu   current_coloru   refreshu   pointu   lineu	   rectangleu   boxu   circleu   discu   polygonu   textu   obj_get_coloru   obj_put_coloru   obj_get_positionu   obj_moveu
   obj_deleteu   obj_showu   obj_hideu	   obj_aboveu	   assoc_keyu   get_keyu   assoc_buttonu   get_mouse_xu   get_mouse_yu   init_idle_funcu	   idle_funcu	   idle_stopu
   idle_startu	   idle_deadu   imageu
   image_drawu   image_from_tilesu   image_rotateu   image_scaleu   image_transformationu	   get_pixelu   im1u   rangeu   tim_magou   __aideu   init_animationu	   animationu	   __figuresu   __clic1u   __name__u   randomu   randintu   mathu   cosu   sinu   piu   timeu   sleep(    (    (    u   cng.pyu   <module>.   s   

	
									'					"																				
	&								<	