Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

OpenSpace _ Programmation _ Momo Se Remet à La "programmation"

Ecrit par: momo 21/02/2004 1:21

CODE
from Tkinter import *
def printit(event):
   words=dict([("..--..","?"),("--..--",","),(".-.-.-","."),("----.","9"),("---..","8"),
           ("--...","7"), ("-....","6"), (".....","5"), ("....-","4"), ("...--","3"),
           ("..---","2"), (".----","1"), ("-----","0"), ("--..","z"), ("-.--","y"),
           ("-..-","x"), ("...-","v"), ("--.-","q"), (".---","j"), ("....","h"),
           ("..-.","f"), ("-.-.","c"), ("-...","b"), (".--.","p"), ("..-", "u"), ("...","s"),
           (".-.","r"), ("---","o"), ("-.-","k"), ("--.","g"), ("-..","d"),
           ("-.","n"), ("..","i"), ("--","m"), (".-","a"), (".","e"), ("-","t"),
           (".-..","l"), (".--","w")])
   fichier=unicode(ent.get())
   sfichier=""
   caractere="0"
   counter=0
   while caractere<>"":
       if counter<int(len(fichier)):
           caractere=fichier[counter]
       else:
           caractere=""
       counter=counter+1
       chaine =""
       while ( caractere=="." or caractere=="-"):
           chaine=chaine+caractere
           if counter<int(len(fichier)):
               caractere=fichier[counter]
           else:
               caractere=""
           counter=counter+1
       if words.has_key(chaine):
           schaine=words[chaine]
           chaine=""
           caractere="."
           sfichier=sfichier+unicode(schaine)
       else:
           sfichier=sfichier+unicode(chaine)
           chaine=""

       if (caractere=="." or caractere=="-"):
           caractere="0"
       else:
           sfichier=sfichier+unicode(caractere)
   lab.configure(text=unicode(sfichier))

fen=Tk()
ent=Entry(fen)
lab=Label(fen)
ent.bind("<Return>",printit)
ent.pack()
lab.pack()
fen.mainloop()

Ben ouais, m'ennuyant, je me suis acheté "Apprendre à programmer avec Python" et "Python Précis et concis" (non, pas seulement pour avoir le sadisme de mettre le python en présence de la mangouste wink.gif).
Et comme j'ai toujours ce programme @ la con de decodage de code Morse qui traine ...

Ecrit par: Gfx 21/02/2004 3:09

\o/ Python \o/

Par contre tu devrais réécrire ton programme avec une approche plus "pythonesque". Par exemple au lieu de if (caractere=="." or caractere=="-") tu peux mettre :
if caractere in ".-"

:-))

Ecrit par: Sha 21/02/2004 11:26

Héhé c'est étrange, j'ai moi aussi remis la main sur python, à partir de tutos comme les cours de Gfx et "Dive into pyhton". Pour l'instant je suis un peu frustré par la vieillesse de ce que j'ai, mais j'espère pouvoir bientôt récuperer des trucs plus récents. Dans "Dive ..." y'a un exemple d'utilisation de parser html et xml qui permet de convertir un texte anglais "normal" en texte "swedish cook", "elmer", etc, très rigolo ;-)

Ecrit par: Gfx 21/02/2004 12:05

Pourquoi vieux ? Le langage n'a subit que peu de changements récemmenet et ce sont seulement des modifications utiles aux personnes le connaissant déjà bien ^^

Ecrit par: momo 21/02/2004 13:00

m'enfin pour les if un peu lourd, disons que je n'ai pas cherché de meilleure solution (et j'en suis qu'au debut dudit bouquqin .. tongue.gif ) et le basic laisse de terribles sequelles ... rolleyes.gif

Ecrit par: momo 21/02/2004 21:59

le petit dernier :
CODE

# -*- coding: cp1252 -*-
from Tkinter import *
from math import *
#Données initiales
cvSize=400 #Taille du Canvas
echelle=800000/cvSize #calcul de l'echelle en Km par pixel
eDiam=12756/200 #diametre du premier cercle en pixel
lDiam=3476/200 #diametre du seconde cercle en pixel
m1=5.9742E24 #en kg
m2= 7.349E22 #en kg
distanc=384400 #distance séparant les cercles (en km)
x1=eDiam/2
y1=cvSize/2
x2=x1+ (distanc/echelle)
y2=y1
#Definitions des fonctions de modifications de coordonnees
# cercle 1
def haut():
   global x1,y1
   y1=y1-10
   if y1<0:
       y1=0
   cosmos.coords(earth,x1,y1,x1+eDiam,y1+eDiam)
   l2upd()
def gauche():
   global x1,y1
   x1=x1-10
   if x1<0:
       x1=0
   cosmos.coords(earth,x1,y1,x1+eDiam,y1+eDiam)
   l2upd()
def droite():
   global x1,y1
   x1=x1+10
   if x1>(cvSize-eDiam):
       x1=cvSize-eDiam
   cosmos.coords(earth,x1,y1,x1+eDiam,y1+eDiam)
   l2upd()
def bas():
   global x1,y1
   y1=y1+10
   if y1>(cvSize-eDiam):
       y1=cvSize-eDiam
   cosmos.coords(earth,x1,y1,x1+eDiam,y1+eDiam)
   l2upd()
# cercle 2
def hauta():
   global x2,y2
   y2=y2-10
   if y2<0:
       y2=0
   cosmos.coords(moon,x2,y2,x2+lDiam,y2+lDiam)
   l2upd()
def gauchea():
   global x2,y2
   x2=x2-10
   if x2<0:
       x2=0
   cosmos.coords(moon,x2,y2,x2+lDiam,y2+lDiam)
   l2upd()
def droitea():
   global x2,y2
   x2=x2+10
   if x2>(cvSize-lDiam):
       x2=cvSize-lDiam
   cosmos.coords(moon,x2,y2,x2+lDiam,y2+lDiam)
   l2upd()
def basa():
   global x2,y2
   y2=y2+10
   if y2>(cvSize-lDiam):
       y2=cvSize-lDiam
   cosmos.coords(moon,x2,y2,x2+lDiam,y2+lDiam)
   l2upd()
#Calcul de la distance entre les cercles
def distance():
   x=abs((x2+lDiam/2)-(x1+eDiam/2))
   y=abs((y2+lDiam/2)-(y1+eDiam/2))
   d=sqrt(x**2+y**2)*echelle
   return d
#Calcul de la force gravitationelle entre les cercles
def forceg():
   resultat=6.67E-11*m1*m2/(distance())**2
   return resultat
#Mise à jour du texte de lab2
def l2upd():
   lab2.configure(text="Distance : "+str(distance())+\
   " Kilometres. Force gravitationelle : "+str(forceg())+" Newtons.")
#Fenêtre principale
fen=Tk()
lab1=Label(fen,text="Cercle bleu : "+str(m1)+" kg. Cercle blanc : "+str(m2)+\
          " kg. Echelle : 1 pixel pour "+str(echelle)+" km")
lab1.grid(row=0, column=0)
cosmos=Canvas(fen,bg="black",height=cvSize,width=cvSize)
cosmos.grid(row=1, column=0,rowspan=6)
lab2=Label(fen)
lab2.grid(row=7,column=0)
earth=cosmos.create_oval(x1,y1,x1+eDiam,y1+eDiam,outline="blue",fill="blue")
moon=cosmos.create_oval(x2,y2,x2+lDiam,y2+lDiam,outline="white",fill="white")
haut1=Button(fen,text="Haut",command=haut)
bas1=Button(fen,text="Bas",command=bas)
gauche1=Button(fen,text="Gauche",command=gauche)
droite1=Button(fen,text="Droite",command=droite)
haut2=Button(fen,text="Haut",command=hauta)
bas2=Button(fen,text="Bas",command=basa)
gauche2=Button(fen,text="Gauche",command=gauchea)
droite2=Button(fen,text="Droite",command=droitea)
haut1.grid(row=1,column=2)
bas1.grid(row=3,column=2)
gauche1.grid(row=2,column=1)
droite1.grid(row=2,column=3)
haut2.grid(row=4,column=2)
bas2.grid(row=6,column=2)
gauche2.grid(row=5,column=1)
droite2.grid(row=5,column=3)
l2upd()
fen.mainloop()

m'enfin, vivement que j'avance un peu plus dans ce bouquin, histoire de trouver une solution plus élégante pour les différents boutons ... (sans compter l'immonde hack quand je me suis rendu compte de les cercles n'ont pas le centre comme origine .. tongue.gif)
M'enfin : notez bien, j'ai commenté mon code !!! tongue.gif
(par contre, la précision du prog, c'est pas ça, mais bon, si je voulais des calculs exacts, je ne serai pas parti sur ce genre d'interface à la con ... )

Ecrit par: Gfx 21/02/2004 22:34

C'est pas nécessaire l'utilisation de "global" normalement smile.gif

Ecrit par: momo 22/02/2004 0:18

ben, si je le retire (ou que je tentes de le declarer à la C), j'ai le droit à ça :
CODE
Exception in Tkinter callback
Traceback (most recent call last):
 File "C:\Python23\lib\lib-tk\Tkinter.py", line 1345, in __call__
   return self.func(*args)
 File "C:\Documents and Settings\Le Meut\Mes documents\ex81.py", line 19, in ha
ut
   y1=y1-10
UnboundLocalError: local variable 'y1' referenced before assignment

Ecrit par: Gfx 22/02/2004 1:34

Ah pardon j'avais pas fait gaffe que tes fonctions sont des handlers Tk. Au temps pour moi. C'est bien bien crade et laid le Tk quand même ^^

Ecrit par: Sha 22/02/2004 8:15

Gfx> Ce sont mes tutos qui sont "vieux", c'est à dire un peu basique et peu représentatifs de toutes les choses fonfonnes que l'on peu faire avec Python, du moins j'imagine, ayant vaguement entendu parler de Zope et ressentant à cet égard une trique impressionnante rolleyes.gif .

Ecrit par: momo 22/02/2004 14:37

Sha>
http://www.ulg.ac.be/cifen/inforef/swi/python.htm
avant de l'acheter, tu peux toujours le lire ... smile.gif

(chouette : l'exercie suivant, c'est l'amélioration de l'interface .. je vais en profiter pour changer le système de coords ... )
et hop :
CODE

def clikit(event):
   global objet,x1,y1,x2,y2
   x=event.x
   y=event.y
   if objet=="":
       if ((x-x1)**2+(y-y1)**2)<=eDiam**2:
           objet=earth
       elif ((x-x2)**2+(y-y2)**2)<=lDiam**2:
           objet=moon
   elif objet==earth:
       x1,y1=x,y
       cosmos.coords(earth,x1-(eDiam/2),y1-(eDiam/2),x1+(eDiam/2),y1+(eDiam/2))
       objet=""
   elif objet==moon:
       x2,y2=x,y
       cosmos.coords(moon,x2-(lDiam/2),y2-(lDiam/2),x2+(lDiam/2),y2+(lDiam/2))
       objet=""
   l2upd()

m'enfin, là, je trouve le PDA pratique : pippy et diverses docs d'installées et je peux coder où je veux ... smile.gif
bon, dommage que pippy avance que si peu ... mais bon, c'est suffisant pour tester des algos ...

Ecrit par: Sha 22/02/2004 17:47

Merci Momo, juste ce que je cherchais wahaha.gif

Ecrit par: momo 02/03/2004 16:06

et hop :
CODE

# -*- coding: Latin-1 -*-
from Tkinter import *
# Definition des classes à utiliser :
class Cercle(Canvas):
   def __init__(self,boss=None,larg=200,haut=200):
       Canvas.__init__(self)
       self.configure(width=larg,height=haut)
       self.larg,self.haut=larg,haut

   def traceCercle(self, taille=5, coul="red"):
       posx,posy=(self.larg/2)-taille,(self.haut/2)-taille
       taix,taiy=posx+2*taille,posy+2*taille
       n=self.create_oval(posx,posy,taix,taiy,outline=coul,fill=coul)
       return n

class ChoixTaille(Frame):
   def __init__(self, boss=None):
       Frame.__init__(self)
       self.taille=5
       Scale(self, length=150, orient=HORIZONTAL,sliderlength=25,\
             label="Taille du cercle", from_=5, to_=100,tickinterval=15,\
             resolution=1,showvalue=1,command=self.setTaille).pack()
   def setTaille(self,f):
       self.taille=int(f)
       self.event_generate('<Control-Z>')
   def getTaille(self):
       n=self.taille
       return n
#definition de la fenêtre principale
class TailleCercle(Frame):
   def __init__(self,boss=None):
       Frame.__init__(self)
       self.gra=Cercle(self,larg=400,haut=400)
       self.gra.configure(bg="black")
       self.gra.pack(side=TOP)
       self.cercle=""
       self.controle=ChoixTaille(self)
       self.controle.pack()
       self.master.bind("<Control-Z>",self.montreCercle)
       self.master.title("Variation de taille d'un cercle")
       self.pack()
   def montreCercle(self,event):
       self.gra.delete(self.cercle)
       self.cercle=self.gra.traceCercle(taille=int(self.controle.getTaille()),coul="White")
#programme principal
if __name__=="__main__":
   TailleCercle().mainloop()

m'enfin, c'est marrant : autant en java le concept de classe me fait chier, autant en python, je trouve ça simple et élégant ...
rq : c'est peut être parceque le langage me laisse le choix ... et me permet de passer à du code objet progressivement ...
m'enfin, y a pas à dire mais le bouquin est bien fait ...

Ecrit par: Dude76 02/03/2004 17:34

JE VEUX ME REMETTRE A PROGRAMMER !!! OUINNNNNNNN !!! bouh.gif

Ecrit par: momo 02/03/2004 18:25

ça tombe bien, il y a un ou deux liens qui trainenet dans le sujet à ce propos ... smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)