Gestion des boutons sur un canevas
Ben
-
Phil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
Phil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Gestion des boutons sur un canevas
- Canevas gratuit - Télécharger - Divers Photo & Graphisme
- Logiciel gestion locative gratuit excel - Télécharger - Comptabilité & Facturation
- A quoi servent les boutons de couleur sur une telecommande - Guide
- Comment réinitialiser un téléphone avec les boutons - Guide
- Logiciel gestion photo gratuit - Guide
2 réponses
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:
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 .....
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 .....