Gestion des boutons sur un canevas

Fermé
Ben - 17 mai 2020 à 18:24
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 20 mai 2020 à 12:04
Bonjour,
Je prépare actuellement un jeu sur python tkinter.
Cependant, parmi mes principaux problèmes, je n'arrive pas à faire déplacer les joueurs (qui sont des pions) grâce aux boutons qui s'affichent sur le canvas. J'utilise les widget button pour cela.
Pour que vous compreniez mon problème, voici le programme :

from tkinter import *
import time
import random

##paramètres généraux
a = 30 #rayon pion

##fonctions
def Modification():
liste_des_items = vas.find_all()
no_item = random.randint(1, len(liste_des_items))
print(no_item)
Canvas.itemconfigure(no_item, fill = 'red')
Canvas.move(no_item, 100, 100)

def Pion(x, y):
"""Dessiner un cercle (x,y) et de rayon r"""
x = random.randint(0,Largeur)
y = random.randint(0,Hauteur)

r = 15

item = Canvas.create_oval(x-r, y-r, x+r, y+r, outline = 'black', fill = 'black')

print("Création du cercle (item" , item , ")")
# affichage de tous les items de Canvas
print(Canvas.find_all())


def Undo():
""" Efface le dernier cercle"""
if len(Canvas.find_all()) > 1:
item = Canvas.find_all()[-1]
# on efface le cercle
can.delete(item)

print("Suppression du Pion (item" , item ,")")
# affichage de tous les items de Canvas
print(Canvas.find_all())

def EffacerTout():
""" Efface tous les cercles"""
while len(Canvas.find_all()) > 1:
Undo()

def flecheDroite(event):
print("Déplace vers la droite")
can.move(pion,PAS,0)
can.pack()

def flecheGauche(event):
print("Déplace vers la gauche")
can.move(pion,PAS,0)
can.pack()

def flecheUp(event):
print("Déplace vers le haut")
can.move(pion,PAS,0)
can.pack()

def flecheDown(event):
print("Déplace vers le bas")
can.move(pion,PAS,0)
can.pack()

def plateau() :
""" Commencer la partie"""
can.create_image(0, 0, anchor = 'nw', image = image_de_fond)
Pion = can.create_oval(PosX-10,PosY-10,PosX+10,PosY+10,width = 3,outline = 'black',fill = 'red')
can.focus_set()
can.bind('<Key>',Clavier)
can.pack(padx = 5, pady = 5)
Pions_rouges = []
x0r, y0r = 50, 50
for i in range(4):
for j in range(2):
x, y = x0r + 50*i, y0r + 50*j
## x, y = (0, 0) (0, 50), (50, 0), (50, 50)
item = can.create_oval(x-a,y-a,x+a,y+a,width = 1 ,fill = ['red'])
Pions_rouges.append(item)
## Pions_rouges[0] correspond au pion initialement en (0, 0)
Pions_bleus = []
x0b, y0b = 549, 400
for i in range(4):
for j in range(2):
x, y = x0b + 50*i, y0b + 50*j
## x, y = (250, 250) (0, 250), (250, 0), (250, 250)
item = can.create_oval(x-a,y-a,x+a,y+a,width = 1 ,fill = ['blue'])
Pions_bleus.append(item)
## Pions_rouges[0] correspond au pion initialement en (0, 0)

def Clic(event):
""" Gestion de l'événement Clic gauche """
global DETECTION_CLIC_SUR_OBJET, NO_ITEM_DEPLACE

# position du pointeur de la souris
X = event.x
Y = event.y
print("Position du clic -> ",X,Y)

## Trouver le pion le plus proche
##http://tkinter.fdex.eu/doc/caw.html#Canvas.find_closest
# coordonnées de l'objet
##[xmin,ymin,xmax,ymax] = Canvas.coords(Carre)
t = can.find_closest(X, Y)
print(type(t))
print(t)
no_item = t[0]
print(no_item)
can.itemconfigure(no_item, fill = 'grey')
NO_ITEM_DEPLACE = no_item
"""
print("Position objet -> ",xmin,ymin,xmax,ymax)
if xmin<=X<=xmax and ymin<=Y<=ymax: DETECTION_CLIC_SUR_OBJET = True
else: DETECTION_CLIC_SUR_OBJET = False
print("DETECTION CLIC SUR OBJET -> ",DETECTION_CLIC_SUR_OBJET)
"""

def Drag(event):
global NO_ITEM_DEPLACE
""" Gestion de l'événement bouton gauche enfoncé """
X = event.x
Y = event.y
print("Position du pointeur -> ",X,Y)
x0, y0, x1, y1 = can.coords(NO_ITEM_DEPLACE)
can.coords(NO_ITEM_DEPLACE, X-a, Y-a, X+a, Y+a)
can.itemconfigure(NO_ITEM_DEPLACE, fill = 'orange')

##
## if DETECTION_CLIC_SUR_OBJET == True:
## #limite de l'objet dans la zone graphique
## if X<0: X=0
## if X>Largeur: X=Largeur
## if Y<0: Y=0
## if Y>Hauteur: Y=Hauteur
## #mise à jour de la position de l'objet (drag)
## Canvas.coords(Carre,X-TailleCarre,Y-TailleCarre,X+TailleCarre,Y+TailleCarre)

def Clavier(event):
""" Gestion de l'événement Appui sur une touche du clavier """
global PosX,PosY
touche = event.keysym
print(touche)
# déplacement vers le haut
if touche == 'Up':
PosY -= 20
# déplacement vers le bas
if touche == 'Down':
PosY += 20
# déplacement vers la droite
if touche == 'Right':
PosX += 20
# déplacement vers la gauche
if touche == 'Left':
PosX -= 20
# on dessine le pion à sa nouvelle position
Canvas.coords(Pion,PosX -10, PosY -10, PosX +10, PosY +10)

def delete(): # Arrêter le jeu
for i in can.find_all():
can.delete(i)

# position initiale du pion
PosX = 230
PosY = 150

# Création d'un widget Canvas (zone graphique)
# Création de la fenêtre
Mafenetre = Tk()
Mafenetre.title('Jeu de pions')

Largeur = 480
Hauteur = 320
# Mafenetre.attributes('-fullscreen',1)
Mafenetre.configure(background = 'darkgreen')
titre = Label(Mafenetre, text = 'JEU DE PIONS',font = 'Castellar 50 bold underline',background = 'darkgreen')
titre.pack(padx = 10,pady = 10)
can = Canvas(Mafenetre,height = 500,width = 750)
can.pack()

# La méthode bind() permet de lier un événement avec une fonction
can.bind('<Button-1>',Clic) # évévement clic gauche (press)
can.bind('<B1-Motion>',Drag) # événement bouton gauche enfoncé (hold down)

# labels
# affichage_compteur = Label(Mafenetre, text = '0', font = ("Helvetica", 12))
# affichage_compteur.grid(row = 1, column = 1)

# Image de fond
image_de_fond = PhotoImage(file = "IMAGE/PLATEAU(1).gif")
## can.create_image(0, 0, anchor = 'nw' , image_de_fond)

# Création d'un widget "Commencer la partie :"
bouton = Button(Mafenetre, text = "Nouvelle partie :",command = plateau, font = 'Castellar 15 bold', bg = "saddlebrown")
bouton.pack()
# Création d'un widget Button "Déplacement vers la gauche"
BoutonEvent = Button(Mafenetre, text = '⇐', command = flecheGauche, font = 'Castellar 19 bold', bg = "saddlebrown")
BoutonEvent.pack(side = LEFT, padx = 60, pady = 30)
# Création d'un widget Button go
BoutonGo = Button(Mafenetre, text = '⇑', command = flecheUp, font = 'Castellar 19 bold', bg = "saddlebrown")
BoutonGo.pack(side = LEFT, padx = 60, pady = 30)
# Création d'un widget Button go
BoutonDown = Button(Mafenetre, text = '⇓', command = flecheDown, font = 'Castellar 19 bold', bg = "saddlebrown")
BoutonDown.pack(side = LEFT, padx = 60, pady = 30)
# Création d'un widget Button "Déplacement vers la droite"
BoutonEvent = Button(Mafenetre, text = '⇒', command = flecheDroite, font = 'Castellar 19 bold', bg = "saddlebrown")
BoutonEvent.pack(side = LEFT, padx = 60, pady = 30)
# Création d'un widget Button effacer
BoutonEffacer = Button(Mafenetre, text = 'Arrêter le jeu', command = delete,font = 'Castellar 19 bold', bg = "saddlebrown")
BoutonEffacer.pack(side = LEFT, padx = 60, pady = 30)
# Création d'un widget Button quitter
BoutonQuitter = Button(Mafenetre, text = 'QUITTER', command = Mafenetre.destroy,font = 'Castellar 16 bold', bg = "red")
BoutonQuitter.pack(side = LEFT, padx = 60, pady = 30)

##initialisations
DETECTION_CLIC_SUR_OBJET = False

Mafenetre.mainloop()


Merci par avance pour votre aide.
A voir également:

2 réponses

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 18 mai 2020 à 12:07
Bonjour Ben,

Il faut absolument mettre les balises de code pour que ton script soit lisible:

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Ca doit ressembler à ça:

for k in range (10):
    print(msg[k])


Au fait, est-ce que ton appel "Problème d'exécution d'un programme" du 14 mai est résolu ?

Je vois le même code ici .....
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
20 mai 2020 à 12:04
Hello Ben,

si tu nous fais voir ton code avec les balises, on pourra le tester et te dire ce qui ne va pas …

ca ne t'intéresse plus ? :-)
0