Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/04/2016, à 11:03

LeSmaug

Programme Tkinter

Bonjour à tous, je suis en terminale S et j'ai pris la spécialité Isn car je m'intéresse à l'informatique. Pour mon projet de fin d'année j'ai décidé de faire une sorte de partie de ping pong en tkinter, mon programme à du mal à avancer mais il est trop tard pour faire demi tour. J'ai besoin de votre aide car je suis bloqué (message d'erreur) et je ne comprend pas pourquoi.Aidez moi svp. Voici mon programme :

from tkinter import *
import math,random
fenetre = Tk()

LARGEUR = 480
HAUTEUR = 320
RAYON = 5 # rayon de la balle

# position initiale au milieu
X = LARGEUR/2
Y = HAUTEUR/2

# direction initiale aléatoire
vitesse = random.uniform(1.8,2)*5
angle = random.uniform(0,2*math.pi)
DX = vitesse*math.cos(angle)
DY = vitesse*math.sin(angle)

# fonction touche clavier
def clavier(event):
    global coords

    touche = event.keysym

    if touche == "Up":
        coords = (coords[0], coords[1] - 10)
    elif touche == "Down":
        coords = (coords[0], coords[1] + 10)
       
    # changement de coordonnées pour le rectangle
    canvas.coords(rectangle, coords[0], coords[1], coords[0]+25, coords[1]+50)

# fonction déplacement de balle
def deplacement():
    global X,Y,DX,DY,RAYON,LARGEUR,HAUTEUR
   
    # rebond à droite
    if X+RAYON+DX > LARGEUR:
        X = 2*(LARGEUR-RAYON)-X
        DX = -DX
   
    # rebond à gauche
    if X-RAYON+DX < 0:
        X = 2*RAYON-X
        DX = -DX
   
    # rebond en bas
    if Y+RAYON+DY > HAUTEUR:
        Y = 2*(HAUTEUR-RAYON)-Y
        DY = -DY
       
    # rebond en haut
    if Y-RAYON+DY < 0:
        Y = 2*RAYON-Y
        DY = -DY
   
    X = X+DX
    Y = Y+DY
   
    # affichage
    canvas.coords(Balle,X-RAYON,Y-RAYON,X+RAYON,Y+RAYON)

    # mise à jour toutes les 50 ms
    Mafenetre.after(50,deplacement)

# coordonnées initiales
coords = (0, 0)
# création du rectangle
rectangle = Canvas.create_rectangle(0,0,25,50,fill="violet")
# Création de la balle
Balle = Canvas.create_oval(X-RAYON,Y-RAYON,X+RAYON,Y+RAYON,width=1,fill='green')
# ajout du bond sur les touches du clavier
canvas.focus_set()
canvas.bind("<Key>", clavier)
# Création canvas
canvas = Canvas(fenetre,height=HAUTEUR,width=LARGEUR,bg='white')
canvas.pack(padx=5,pady=5)

Hors ligne

#2 Le 23/04/2016, à 11:10

pingouinux

Re : Programme Tkinter

Bonjour,
Pour que ce soit lisible, merci de mettre le programme (et les messages d'erreur) entre balises-code <>.
Quel est le message d'erreur ?

Hors ligne

#3 Le 23/04/2016, à 11:28

LeSmaug

Re : Programme Tkinter

Programme:
<
from tkinter import *
import math,random
fenetre = Tk()

LARGEUR = 480
HAUTEUR = 320
RAYON = 5 # rayon de la balle

# position initiale au milieu
X = LARGEUR/2
Y = HAUTEUR/2

# direction initiale aléatoire
vitesse = random.uniform(1.8,2)*5
angle = random.uniform(0,2*math.pi)
DX = vitesse*math.cos(angle)
DY = vitesse*math.sin(angle)

# fonction touche clavier
def clavier(event):
    global coords

    touche = event.keysym

    if touche == "Up":
        coords = (coords[0], coords[1] - 10)
    elif touche == "Down":
        coords = (coords[0], coords[1] + 10)
       
    # changement de coordonnées pour le rectangle
    canvas.coords(rectangle, coords[0], coords[1], coords[0]+25, coords[1]+50)

# fonction déplacement de balle
def deplacement():
    global X,Y,DX,DY,RAYON,LARGEUR,HAUTEUR
   
    # rebond à droite
    if X+RAYON+DX > LARGEUR:
        X = 2*(LARGEUR-RAYON)-X
        DX = -DX
   
    # rebond à gauche
    if X-RAYON+DX < 0:
        X = 2*RAYON-X
        DX = -DX
   
    # rebond en bas
    if Y+RAYON+DY > HAUTEUR:
        Y = 2*(HAUTEUR-RAYON)-Y
        DY = -DY
       
    # rebond en haut
    if Y-RAYON+DY < 0:
        Y = 2*RAYON-Y
        DY = -DY
   
    X = X+DX
    Y = Y+DY
   
    # affichage
    canvas.coords(Balle,X-RAYON,Y-RAYON,X+RAYON,Y+RAYON)

    # mise à jour toutes les 50 ms
    Mafenetre.after(50,deplacement)

# coordonnées initiales
coords = (0, 0)
# création du rectangle
rectangle = Canvas.create_rectangle(0,0,25,50,fill="violet")
# Création de la balle
Balle = Canvas.create_oval(X-RAYON,Y-RAYON,X+RAYON,Y+RAYON,width=1,fill='green')
# ajout du bond sur les touches du clavier
canvas.focus_set()
canvas.bind("<Key>", clavier)
# Création canvas
canvas = Canvas(fenetre,height=HAUTEUR,width=LARGEUR,bg='white')
canvas.pack(padx=5,pady=5)
>

message d'erreur:
<
line 69, in <module>
    rectangle = Canvas.create_rectangle(0,0,25,50,fill="violet")
  File "C:\Users\Ordinateur\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2340, in create_rectangle
    return self._create('rectangle', args, kw)
AttributeError: 'int' object has no attribute '_create'
>

ps: désolé si je n'ai pas  bien mis les balises-code.

Hors ligne

#4 Le 23/04/2016, à 11:52

pingouinux

Re : Programme Tkinter

Essaye en définissant

canvas = Canvas(fenetre,height=HAUTEUR,width=LARGEUR,bg='white')

avant

# création du rectangle
rectangle = canvas.create_rectangle(0,0,25,50,fill="violet")
# Création de la balle
Balle = canvas.create_oval(X-RAYON,Y-RAYON,X+RAYON,Y+RAYON,width=1,fill='green')

Dans ces 2 commandes, on utilise la variable canvas définie avant.

Lancer ensuite la boucle avec :

fenetre.mainloop()

Pour les balises-code, il faut utiliser l'icône <> au-dessus de la zone de composition du message.

Hors ligne

#5 Le 23/04/2016, à 12:36

LeSmaug

Re : Programme Tkinter

Merci de ta proposition mais le programme de fonctionne toujours pas, il m'affiche le même message d'erreur.

Hors ligne

#6 Le 23/04/2016, à 16:19

pingouinux

Re : Programme Tkinter

As-tu corrigé le programme comme je te l'ai indiqué en #4. Notamment, sur les lignes définissant rectangle et Balle, Canvas a été remplacé par canvas.
Sinon, montre ton programme corrigé (entre balises-code).

Hors ligne