#1 Le 18/05/2019, à 16:30
- Nat62
SOS aide pour programmer "le mot à trouver" élève de seconde
Résolu
merci à tous
Dernière modification par Nat62 (Le 21/05/2019, à 08:53)
Hors ligne
#2 Le 18/05/2019, à 17:51
- Watael
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
et comment ça se passe avec hirren's_hbcd ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 18/05/2019, à 20:11
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
j'ai commencé à faire ceci .Mais c'est plus dur que la machine à sous de ma fille !!!
from tkinter import*
def Clic(event):
global DETECTION_CLIC_SUR_OBJET
X= event.x
Y= event.y
print("Position du clic -> ",X,Y)
[xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge1)
print("Position du clic -> ",X,Y)
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):
#Gestion de lévénement bouton gauche enfoncé
X= event.x
Y= event.y
print("Position du pointeur ->",X,Y)
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 a jour de la position de l'objet (drag)
Canevas.coords(Carre_Bouge1,X-TailleCarre1, Y-TailleCarre1,X+TailleCarre1,Y+TailleCarre1)
DETECTION_CLIC_OBJET = False
# Création de la fenêtre principale
Mafenetre = Tk()
Mafenetre.title("Le mot a trouver")
#Création d'un widget Canvas
Largeur= 400
Hauteur= 300
TailleCarre1=20
TailleCarre=20
TailleCarre2=20
Canevas=Canvas(Mafenetre,width=Largeur,height=Hauteur,bg='White')
#Création de sept carrés alignés sur une ligne dans lesquels on va y mettre les lettres
Carre1=Canevas.create_rectangle(50,100,90,140,fill='white',outline='black')
Carre2=Canevas.create_rectangle(90,100,130,140,fill='white',outline='black')
Carre3=Canevas.create_rectangle(130,100,170,140,fill='white',outline='black')
Carre4=Canevas.create_rectangle(170,100,210,140,fill='white',outline='black')
Carre5=Canevas.create_rectangle(210,100,250,140,fill='white',outline='black')
Carre6=Canevas.create_rectangle(250,100,290,140,fill='white',outline='black')
Carre7=Canevas.create_rectangle(290,100,330,140,fill='white',outline='black')
#Création de sept carrés alignés sur une ligne dans lesquels les lettres mélangées vont apparaître
Carre_Bouge1=Canevas.create_rectangle(40,200,TailleCarre1*4,TailleCarre1*12,fill='white',outline='black')
Carre_Bouge2=Canevas.create_rectangle(80,200,TailleCarre*6,TailleCarre*12,fill='white',outline='black')
Carre_Bouge3=Canevas.create_rectangle(120,200,TailleCarre*8,TailleCarre*12,fill='white',outline='black')
Carre_Bouge4=Canevas.create_rectangle(160,200,TailleCarre*10,TailleCarre*12,fill='white',outline='black')
Carre_Bouge5=Canevas.create_rectangle(200,200,TailleCarre*12,TailleCarre*12,fill='white',outline='black')
Carre_Bouge6=Canevas.create_rectangle(240,200,TailleCarre*14,TailleCarre*12,fill='white',outline='black')
Carre_Bouge7=Canevas.create_rectangle(280,200,TailleCarre*16,TailleCarre*12,fill='white',outline='black')
#La méthode bind() permet de lier un événement avec une fonction
Canevas.bind('<Button-1>',Clic) #événement clic gauche (press)
Canevas.bind('<B1-Motion>',Drag) #événement bouton gauche enfoncé (hold down)
Canevas.focus_set()
Canevas.pack(padx=10,pady=10)
Mafenetre.mainloop()
j'ai tracé une ligne de sept carrés; puis une autre;
le premier carré de la deuxième ligne bouge quand on clique dessus mais je n'arrive pas à bouger les six autres !
pouvez vous me dire comment faire pour les faire bouger aussi?
maintenant j'ai aucune idée pour les lettres !!!!
merci de votre aide ; la puce est beaucoup désespérée !!! merci pour elle
Hors ligne
#4 Le 18/05/2019, à 20:36
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
j'essaie d'en faire bouger deux
Du coup j'ai mis une deuxième fois "def clic" et "def drag" mais ça ne marche pas !! le premier de la deuxième ligne ne bouge plus; c'est le deuxième carré qui bouge quand on clique dessus. pouvez-vous m'expliquer pourquoi svp ? je n'y connais pas grand chose en python !!! merci
from tkinter import*
def Clic1(event):
global DETECTION_CLIC_SUR_OBJET
X= event.x
Y= event.y
print("Position du clic -> ",X,Y)
[xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge1)
print("Position du clic -> ",X,Y)
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 Drag1(event):
#Gestion de lévénement bouton gauche enfoncé
X= event.x
Y= event.y
print("Position du pointeur ->",X,Y)
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 a jour de la position de l'objet (drag)
Canevas.coords(Carre_Bouge1,X-TailleCarre1, Y-TailleCarre1,X+TailleCarre1,Y+TailleCarre1)
DETECTION_CLIC_OBJET = False
def Clic2(event):
global DETECTION_CLIC_SUR_OBJET
X= event.x
Y= event.y
print("Position du clic -> ",X,Y)
[xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge2)
print("Position du clic -> ",X,Y)
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 Drag2(event):
#Gestion de lévénement bouton gauche enfoncé
X= event.x
Y= event.y
print("Position du pointeur ->",X,Y)
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 a jour de la position de l'objet (drag)
Canevas.coords(Carre_Bouge2,X-TailleCarre2, Y-TailleCarre2,X+TailleCarre2,Y+TailleCarre2)
DETECTION_CLIC_OBJET = False
# Création de la fenêtre principale
Mafenetre = Tk()
Mafenetre.title("Le mot a trouver")
#Création d'un widget Canvas
Largeur= 400
Hauteur= 300
TailleCarre1=20
TailleCarre=20
TailleCarre2=20
Canevas=Canvas(Mafenetre,width=Largeur,height=Hauteur,bg='White')
#Création de sept carrés alignés sur une ligne dans lesquels on va y mettre les lettres
Carre1=Canevas.create_rectangle(50,100,90,140,fill='white',outline='black')
Carre2=Canevas.create_rectangle(90,100,130,140,fill='white',outline='black')
Carre3=Canevas.create_rectangle(130,100,170,140,fill='white',outline='black')
Carre4=Canevas.create_rectangle(170,100,210,140,fill='white',outline='black')
Carre5=Canevas.create_rectangle(210,100,250,140,fill='white',outline='black')
Carre6=Canevas.create_rectangle(250,100,290,140,fill='white',outline='black')
Carre7=Canevas.create_rectangle(290,100,330,140,fill='white',outline='black')
#Création de sept carrés alignés sur une ligne dans lesquels les lettres mélangées vont apparaître
Carre_Bouge1=Canevas.create_rectangle(40,200,TailleCarre1*4,TailleCarre1*12,fill='white',outline='black')
Carre_Bouge2=Canevas.create_rectangle(80,200,TailleCarre2*6,TailleCarre2*12,fill='white',outline='black')
Carre_Bouge3=Canevas.create_rectangle(120,200,TailleCarre*8,TailleCarre*12,fill='white',outline='black')
Carre_Bouge4=Canevas.create_rectangle(160,200,TailleCarre*10,TailleCarre*12,fill='white',outline='black')
Carre_Bouge5=Canevas.create_rectangle(200,200,TailleCarre*12,TailleCarre*12,fill='white',outline='black')
Carre_Bouge6=Canevas.create_rectangle(240,200,TailleCarre*14,TailleCarre*12,fill='white',outline='black')
Carre_Bouge7=Canevas.create_rectangle(280,200,TailleCarre*16,TailleCarre*12,fill='white',outline='black')
#La méthode bind() permet de lier un événement avec une fonction
Canevas.bind('<Button-1>',Clic1) #événement clic gauche (press)
Canevas.bind('<B1-Motion>',Drag1) #événement bouton gauche enfoncé (hold down)
Canevas.bind('<Button-1>',Clic2) #événement clic gauche (press)
Canevas.bind('<B1-Motion>',Drag2) #événement bouton gauche enfoncé (hold down)
Canevas.focus_set()
Canevas.pack(padx=10,pady=10)
Mafenetre.mainloop()
Hors ligne
#5 Le 18/05/2019, à 21:17
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Bonsoir,
Ne pose pas tes questions dans 2 discussions différentes : 1 problème = 1 discussion
Quand tu cliques, il faut voir si tu te trouves dans un carré, et si oui, lequel.
Tu peux essayer ceci (j'ai bricolé à partir de ton envoi #3) :
#!/usr/bin/env python3
'''
Problématique : l'objectif est de créer un programme qui propose des mots dont les lettres sont dans le désordre et de retrouver ses mots dans un certain temps.
CONTRAINTES : le programme sera écrit en python. Le programme doit permettre de faire des essais ou de passer au mot suivant et de compter le nombre de mots trouvés et le temps passé par un décompte du temps général
aspect : sept cases collées (ou un tableau à une ligne et à sept colonnes)
et plus bas sept cases collées et chaque case contient une lettre
'''
from tkinter import *
def quel_Carre_Bouge(liste_Carre_Bouge,X,Y):
ret=None; k=0
for Carre_Bouge in liste_Carre_Bouge:
[xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge)
if xmin <= X <=xmax and ymin <=Y<=ymax: ret=k,xmin,ymin,xmax,ymax; break
k+=1
return ret
def Clic(event):
global DETECTION_CLIC_SUR_OBJET, ret
X= event.x
Y= event.y
print("Position du clic -> ",X,Y)
ret=quel_Carre_Bouge(liste_Carre_Bouge,X,Y)
if ret!=None:
DETECTION_CLIC_SUR_OBJET=True
k,xmin,ymin,xmax,ymax=ret
print("Carre_Bouge n° %d"%(k+1))
print("Position objet ->",xmin,ymin,xmax,ymax)
else:
DETECTION_CLIC_SUR_OBJET=False
print("DETECTION_CLIC_SUR_OBJET ->",DETECTION_CLIC_SUR_OBJET )
def Drag(event):
#Gestion de lévénement bouton gauche enfoncé
X= event.x
Y= event.y
print("Position du pointeur ->",X,Y)
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 a jour de la position de l'objet (drag)
if ret!=None:
k,xmin,ymin,xmax,ymax=ret
Canevas.coords(liste_Carre_Bouge[k],X-TailleCarre1, Y-TailleCarre1,X+TailleCarre1,Y+TailleCarre1)
DETECTION_CLIC_OBJET = False
# Création de la fenêtre principale
Mafenetre = Tk()
Mafenetre.title("Le mot a trouver")
#Création d'un widget Canvas
Largeur= 400
Hauteur= 300
TailleCarre1=20
TailleCarre=20
TailleCarre2=20
Canevas=Canvas(Mafenetre,width=Largeur,height=Hauteur,bg='White')
#Création de sept carrés alignés sur une ligne dans lesquels on va y mettre les lettres
liste_Carre=[]; x1,y1=50,100
for k in range(7):
x2,y2=x1+40,y1+40
liste_Carre.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black'))
x1=x2
#Création de sept carrés alignés sur une ligne dans lesquels les lettres mélangées vont apparaître
liste_Carre_Bouge=[]; x1,y1=40,200
for k in range(7):
x2,y2=x1+40,y1+40
liste_Carre_Bouge.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black'))
x1=x2
#La méthode bind() permet de lier un événement avec une fonction
Canevas.bind('<Button-1>',Clic) #événement clic gauche (press)
Canevas.bind('<B1-Motion>',Drag) #événement bouton gauche enfoncé (hold down)
Canevas.focus_set()
Canevas.pack(padx=10,pady=10)
Mafenetre.mainloop()
Dernière modification par pingouinux (Le 18/05/2019, à 21:18)
Hors ligne
#6 Le 18/05/2019, à 21:28
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
c'est trop gentil
pourrais tu m'expliquer ce que tu as fais ? j'ai beaucoup de mal à comprendre comment ça marche !
c'est vraiment plus dur que la machine à sous !!!
je n'ai aucune idée pour les lettres !!!
Hors ligne
#7 Le 18/05/2019, à 21:34
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
que permet de faire : append ?
Hors ligne
#8 Le 18/05/2019, à 21:42
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
qu'est ce que ça fait ceci :
print("Carre_Bouge n° %d"%(k+1))
Hors ligne
#9 Le 18/05/2019, à 21:51
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
J'ai généré 2 listes, liste_Carre et liste_Carre_Bouge, contenant chacune 7 cases.
Quand tu cliques, je passe liste_Carre_Bouge en revue pour voir si le pointeur est dans l'une des 7 cases. C'est la fonction quel_Carre_Bouge qui fait ce travail, et qui retourne None, ou bien le numéro de la case et ses coordonnées.
Pour les lettres, il faudrait avoir plus de précisions :
- que contiennent les cases fixes ou mobiles ?
- comment est fournie la liste des mots ?
- ....... ?
liste.append(element) : ajoute un élément à une liste
Hors ligne
#10 Le 18/05/2019, à 21:56
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
qu'est ce que ça fait ceci :
print("Carre_Bouge n° %d"%(k+1))
C'est un print formaté :
"Carre_Bouge n° %d" : le format (du texte suivi d'un entier)
(k+1) : l'entier en question (on ajoute 1, car les éléments de la liste sont numérotés de 0 à 6)
Hors ligne
#11 Le 18/05/2019, à 21:59
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Son prof lui a dit qu'il faut prendre un mot de sept lettres et les mettre dans le désordre !
Ces lettres apparaissent dans la deuxième liste.
L'utilisateur déplace les lettres dans la première liste pour former son mot
il peut faire autant d'essais qu'il veut ou passer au mot suivant. En même temps; il faut compter le nombre de bons mots trouvés et compter combien il a mis de temps !!
Par exemple; il doit trouver dix mots au total
Hors ligne
#12 Le 18/05/2019, à 22:05
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
"C'est un print formaté :
"Carre_Bouge n° %d" : le format (du texte suivi d'un entier)
(k+1) : l'entier en question (on ajoute 1, car les éléments de la liste sont numérotés de 0 à 6)
je suis quelqu'un qui vient d'étudier les cours de ma fille; donc on peut dire que je suis nulle ! du coup je ne comprends pas pourquoi tu as besoin d'un print formaté.
"Carre_Bouge n° %d" c'est un format c'est à dire c'est quoi
Hors ligne
#13 Le 18/05/2019, à 22:23
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
je me suis amusée à essayer de faire une machine à sous pour ma fille . Mais là ! je sèche totalement § je n'ai aucune idée !
par exemple si on choisit pour le premier mot à trouver le mot FILAMENT :
je fais une liste mot1_solution= ["F","I","L","A","M","E","N","T"]
Comment puis je attribuer ces lettres dans le désordre dans la deuxième liste de carré ?
Après l'utilisateur déplace ces rectangles pour former un mot dans la première liste de carrés.
Il essaie autant de fois qu'il veut ou passer au mot suivant
Il faut compter le nombre de bons mots trouvés et le temps qu'il a mis !
par exemple il faut en trouver 10
c'est très compliqué !!!
Hors ligne
#14 Le 18/05/2019, à 22:36
- Nuliel
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Pour la gestion du temps, il n'y a pas de chronomètre, par contre, on peut regarder l'heure au moment où ça commence, au moment où ça finit, et faire la différence.
import time
start = time.time()
..................
le truc à mesurer en secondes
..................
end = time.time()
print(end - start)
Sinon pour moi on peut éviter le print formaté dans python, print("Carre_Bouge n°",k+1) (là on affiche à la suite le texte puis la valeur de k)
Pour mettre les lettres dans le désordre, il y a la fonction shuffle, un exemple trouvé sur internet
import random
number_list = [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
print ("Original list : ", number_list)
random.shuffle(number_list) #shuffle method
print ("List after first shuffle : ", number_list)
random.shuffle(number_list)
print ("List after second shuffle : ", number_list)
Par contre faut retransformer la chaine de caractère en liste, faire le mélange, et retransformer en chaine de caractères.
Hors ligne
#15 Le 18/05/2019, à 23:03
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Pour le traitement des mots, voici une suggestion en mode texte, mais il faudra ensuite faire le lien avec les cases (seul quelqu'un ayant l'esprit mal tourné pourrait voir un quelconque rapport entre le prof de ta fille et certains des mots de la liste…).
#!/usr/bin/env python3
import time
from random import shuffle
liste_mots=[
'sadique',
'pervers',
'forcené',
'traître',
'aileron',
'capiton',
'goudron',
'réactif',
'poireau',
'grillon',
]
nb_mot_cherche=nb_mot_trouve=0
T0=time.time()
arret=False
for mot in liste_mots:
suivant=False
nb_mot_cherche+=1
list_mot=list(mot)
shuffle(list_mot)
vrac=''.join(list_mot)
print(vrac)
while not arret:
ret=input("0 : Arrêter\n1 : Passer au mot suivant\nou faire un essai pour -> %s\n"%vrac)
if ret=='0': arret=True
elif ret=='1': suivant=True; break
else:
if ret==mot: print("\nBravo pour %s et %s !\n"%(vrac,ret)); nb_mot_trouve+=1; suivant=True; break
else: print("\nRaté pour %s et %s !\n"%(vrac,ret))
if arret: break
if suivant: continue
T1=time.time()
print("\n%d mot(s) trouvé(s) sur %d en %d seconde(s)"%(nb_mot_trouve,nb_mot_cherche,T1-T0))
Hors ligne
#16 Le 18/05/2019, à 23:14
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
"Carre_Bouge n° %d" c'est un format c'est à dire c'est quoi
Un format permet de mettre en forme du texte (de le formater).
Dans l'expression ci-dessus, %d va être remplacé par la valeur d'un nombre entier.
On peut effectivement s'en passer, mais je trouve ça pratique.
Hors ligne
#17 Le 19/05/2019, à 10:33
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Recoucou
trop fort pour la liste de mots !:D
on va mettre un bouton" réessayer"(ou reprendre les lettres comme au scrabble !) et un autre bouton" passer au mot suivant"
Pour les lettres que l'on doit mettre dans le désordre ; pourrait-on les mettre dans des label et les déplacer?
Hors ligne
#18 Le 19/05/2019, à 12:19
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
J'ai mis quatre boutons qui ne sont pas fonctionnels car il faut coder les fonctions qui vont avec ! Mais j'ai mis en commentaire dans chaque fonction ce qu'elles doivent faire ! Merci de m'aider !
from tkinter import *
import time
from random import shuffle
#def Demarrer() : A faire -> faire apparaitre les lettres dans le désordre du premier à trouver dans la liste_Carre_Bouge
#def Reesaayer() : A faire -> Ramener les lettres dans la liste_Carre_Bouge
#def Passer_MotSuivant() : A faire -> si les lettres mises dans les carrés de la liste_Carre est = au premier mot à trouver; passer au deuxième ( en tout il y en a 10 °
#def Quitter() : A faire : -> faire apparaitre une boite de dialogue (messagbox) disant combien de mots ont été trouvés et puis quitter l'application
def quel_Carre_Bouge(liste_Carre_Bouge,X,Y):
ret=None; k=0 # ret est un pointeur
for Carre_Bouge in liste_Carre_Bouge:
[xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge)
if xmin <= X <=xmax and ymin <=Y<=ymax: ret=k,xmin,ymin,xmax,ymax; break
k=k+1
return ret
def Clic(event):
global DETECTION_CLIC_SUR_OBJET, ret
X= event.x
Y= event.y
print("Position du clic -> ",X,Y)
ret=quel_Carre_Bouge(liste_Carre_Bouge,X,Y)
if ret!=None:
DETECTION_CLIC_SUR_OBJET=True
k,xmin,ymin,xmax,ymax=ret
#print("Carre_Bouge n° %d"%(k+1)) pas besoin de formater !!
print("Carre_Bouge n°",k+1)
print("Position objet ->",xmin,ymin,xmax,ymax)
else:
DETECTION_CLIC_SUR_OBJET=False
print("DETECTION_CLIC_SUR_OBJET ->",DETECTION_CLIC_SUR_OBJET )
def Drag(event):
#Gestion de lévénement bouton gauche enfoncé
X= event.x
Y= event.y
print("Position du pointeur ->",X,Y)
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 a jour de la position de l'objet (drag)
if ret!=None:
k,xmin,ymin,xmax,ymax=ret
Canevas.coords(liste_Carre_Bouge[k],X-TailleCarre, Y-TailleCarre,X+TailleCarre,Y+TailleCarre)
DETECTION_CLIC_OBJET = False
# Création de la fenêtre principale
Mafenetre = Tk()
Mafenetre.title("Le mot a trouver")
#Création d'un widget Canvas
Largeur= 500
Hauteur= 300
#TailleCarre=20
Canevas=Canvas(Mafenetre,width=Largeur,height=Hauteur,bg='White')
#Création de sept carrés alignés sur une ligne dans lesquels on va y mettre les lettres
liste_Carre=[]; x1=40;y1=100
for k in range(7):
x2=x1+40;y2=y1+40
liste_Carre.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black')) # on ajoute un rectangle à la liste
x1=x2
#Création de sept carrés alignés sur une ligne dans lesquels les lettres mélangées vont apparaître
liste_Carre_Bouge=[]; x1=40;y1=200
for k in range(7):
x2=x1+40;y2=y1+40
liste_Carre_Bouge.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black'))
x1=x2
# Création de quatre boutons
boutonGo = Button(Mafenetre,text='GO',width=5,height=2) #command=Demarrer
boutonGo.place(x=50,y=20)
boutonQuit = Button(Mafenetre,text='Quitter',width=5,height=2) #command=Quitter
boutonQuit.place(x=300,y=20)
boutonReesayer = Button(Mafenetre,text='Réessayer',width=10,height=2) #command=Reessayer
boutonReesayer.place(x=400,y=210)
boutonMotSuivant = Button(Mafenetre,text='Mot suivant',width=10,height=2) #command=Passer_MotSuivant
boutonMotSuivant.place(x=400,y=110)
#La méthode bind() permet de lier un événement avec une fonction
Canevas.bind('<Button-1>',Clic) #événement clic gauche (press)
Canevas.bind('<B1-Motion>',Drag) #événement bouton gauche enfoncé (hold down)
TailleCarre=20
Canevas.focus_set()
Canevas.pack(padx=10,pady=10)
Mafenetre.mainloop()
Hors ligne
#19 Le 19/05/2019, à 12:46
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
j'ai changé un peu ce que doivent faire les fonctions :
#def Demarrer() : A faire -> faire apparaître les lettres du premier mot à trouver dans le désordre dans la liste_Carre_Bouge
#def Reesaayer() : A faire -> Ramener les lettres dans la liste_Carre_Bouge
#def Passer_MotSuivant() : A faire -> passer au mot suivant dans tous les cas ! et mettre un compteur pour compter le nombre de bons mots trouvés et le
temps qu'il a mis
#def Quitter() : A faire : -> faire apparaître une boite de dialogue (messagbox) disant combien de mots ont été trouvés et le temps qu'il a mis. Puis quitter
l'application
Hors ligne
#20 Le 19/05/2019, à 14:02
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Je suis parti de ton script en #18, et ai rendu opérationnels les boutons 'GO' et 'Quitter'. La fonction Demarrer contient provisoirement le script de gestion des mots fourni en #15.
Le cahier des charges est, à mon avis, beaucoup trop chargé (c'est le cas de le dire), pour espérer un résultat pour demain…
#!/usr/bin/env python3
from tkinter import *
import time
from random import shuffle
def Demarrer() : # A faire -> faire apparaître les lettres du premier mot à trouver dans le désordre dans la liste_Carre_Bouge
liste_mots=[
'sadique',
'pervers',
'forcené',
'traître',
'aileron',
'capiton',
'goudron',
'réactif',
'poireau',
'grillon',
]
nb_mot_cherche=nb_mot_trouve=0
T0=time.time()
arret=False
for mot in liste_mots:
suivant=False
nb_mot_cherche+=1
list_mot=list(mot)
shuffle(list_mot)
vrac=''.join(list_mot)
print(vrac)
while not arret:
ret=input("0 : Arrêter\n1 : Passer au mot suivant\nou faire un essai pour -> %s\n"%vrac)
if ret=='0': arret=True
elif ret=='1': suivant=True; break
else:
if ret==mot: print("\nBravo pour %s et %s !\n"%(vrac,ret)); nb_mot_trouve+=1; suivant=True; break
else: print("\nRaté pour %s et %s !\n"%(vrac,ret))
if arret: break
if suivant: continue
T1=time.time()
print("\n%d mot(s) trouvé(s) sur %d en %d seconde(s)"%(nb_mot_trouve,nb_mot_cherche,T1-T0))
#def Reesaayer() : A faire -> Ramener les lettres dans la liste_Carre_Bouge
#def Passer_MotSuivant() : A faire -> passer au mot suivant dans tous les cas ! et mettre un compteur pour compter le nombre de bons mots trouvés et le temps qu'il a mis
#def Quitter() : A faire : -> faire apparaître une boite de dialogue (messagbox) disant combien de mots ont été trouvés et le temps qu'il a mis. Puis quitter l'application
def quel_Carre_Bouge(liste_Carre_Bouge,X,Y):
ret=None; k=0 # ret est un pointeur
for Carre_Bouge in liste_Carre_Bouge:
[xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge)
if xmin <= X <=xmax and ymin <=Y<=ymax: ret=k,xmin,ymin,xmax,ymax; break
k=k+1
return ret
def Clic(event):
global DETECTION_CLIC_SUR_OBJET, ret
X= event.x
Y= event.y
print("Position du clic -> ",X,Y)
ret=quel_Carre_Bouge(liste_Carre_Bouge,X,Y)
if ret!=None:
DETECTION_CLIC_SUR_OBJET=True
k,xmin,ymin,xmax,ymax=ret
#print("Carre_Bouge n° %d"%(k+1)) pas besoin de formater !!
print("Carre_Bouge n°",k+1)
print("Position objet ->",xmin,ymin,xmax,ymax)
else:
DETECTION_CLIC_SUR_OBJET=False
print("DETECTION_CLIC_SUR_OBJET ->",DETECTION_CLIC_SUR_OBJET )
def Drag(event):
#Gestion de lévénement bouton gauche enfoncé
X= event.x
Y= event.y
print("Position du pointeur ->",X,Y)
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 a jour de la position de l'objet (drag)
if ret!=None:
k,xmin,ymin,xmax,ymax=ret
Canevas.coords(liste_Carre_Bouge[k],X-TailleCarre, Y-TailleCarre,X+TailleCarre,Y+TailleCarre)
DETECTION_CLIC_OBJET = False
# Création de la fenêtre principale
Mafenetre = Tk()
Mafenetre.title("Le mot a trouver")
#Création d'un widget Canvas
Largeur= 500
Hauteur= 300
#TailleCarre=20
Canevas=Canvas(Mafenetre,width=Largeur,height=Hauteur,bg='White')
#Création de sept carrés alignés sur une ligne dans lesquels on va y mettre les lettres
liste_Carre=[]; x1=40;y1=100
for k in range(7):
x2=x1+40;y2=y1+40
liste_Carre.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black')) # on ajoute un rectangle à la liste
x1=x2
#Création de sept carrés alignés sur une ligne dans lesquels les lettres mélangées vont apparaître
liste_Carre_Bouge=[]; x1=40;y1=200
for k in range(7):
x2=x1+40;y2=y1+40
liste_Carre_Bouge.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black'))
x1=x2
# Création de quatre boutons
boutonGo = Button(Mafenetre,text='GO',width=5,height=2,command=Demarrer) #command=Demarrer
boutonGo.place(x=50,y=20)
boutonQuit = Button(Mafenetre,text='Quitter',width=5,height=2,command=Mafenetre.destroy) #command=Quitter
boutonQuit.place(x=300,y=20)
boutonReesayer = Button(Mafenetre,text='Réessayer',width=10,height=2) #command=Reessayer
boutonReesayer.place(x=400,y=210)
boutonMotSuivant = Button(Mafenetre,text='Mot suivant',width=10,height=2) #command=Passer_MotSuivant
boutonMotSuivant.place(x=400,y=110)
#La méthode bind() permet de lier un événement avec une fonction
Canevas.bind('<Button-1>',Clic) #événement clic gauche (press)
Canevas.bind('<B1-Motion>',Drag) #événement bouton gauche enfoncé (hold down)
TailleCarre=20
Canevas.focus_set()
Canevas.pack(padx=10,pady=10)
Mafenetre.mainloop()
Hors ligne
#21 Le 19/05/2019, à 15:23
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
J'essaie des trucs de mon côté mais avec ce que j'ai compris dans le cours de ma fille.
j'ai refait deux lignes de sept carrés qui sont tous les deux fixes.
j'ai mis dans le bouton GO ( donc dans la fonction Démarrer) ceci :
"Quand je clique; je fais apparaître les lettres mises dans le désordre du premier mot à trouver par exemple ABRICOT ( sous forme de label) dans les carrés du bas
est-ce possible de faire bouger ces lettres ( sous forme de label) pour les mettre dans la première ligne de carrés ?
Comment j'adapte le def clic et le def drag dans ce cas ?
from tkinter import *
import time
from random import shuffle
def Demarrer() : # A faire -> faire apparaître les lettres du premier mot à trouver dans le désordre dans la liste_Carre_Bouge
listeMot1_solution=["A","B","R","I","C","O","T"]
shuffle(listeMot1_solution)
labelLettre0 = Label(Mafenetre,text=listeMot1_solution[0])
labelLettre0.place(x=60,y=220)
labelLettre1 = Label(Mafenetre,text=listeMot1_solution[1])
labelLettre1.place(x=100,y=220)
labelLettre2 = Label(Mafenetre,text=listeMot1_solution[2])
labelLettre2.place(x=140,y=220)
labelLettre3 = Label(Mafenetre,text=listeMot1_solution[3])
labelLettre3.place(x=180,y=220)
labelLettre4= Label(Mafenetre,text=listeMot1_solution[4])
labelLettre4.place(x=220,y=220)
labelLettre5 = Label(Mafenetre,text=listeMot1_solution[5])
labelLettre5.place(x=260,y=220)
labelLettre6= Label(Mafenetre,text=listeMot1_solution[6])
labelLettre6.place(x=300,y=220)
#def Reesaayer() : A faire -> Ramener les lettres dans la liste_Carre_Bouge
#def Passer_MotSuivant() : A faire -> passer au mot suivant dans tous les cas ! et mettre un compteur pour compter le nombre de bons mots trouvés et le temps qu'il a mis
#def Quitter() : A faire : -> faire apparaître une boite de dialogue (messagbox) disant combien de mots ont été trouvés et le temps qu'il a mis. Puis quitter l'application
#def quel_Carre_Bouge(liste_Carre_Bouge,X,Y):
# ret=None; k=0 # ret est un pointeur
# for Carre_Bouge in liste_Carre_Bouge:
# [xmin,ymin,xmax,ymax] = Canevas.coords(Carre_Bouge)
# if xmin <= X <=xmax and ymin <=Y<=ymax: ret=k,xmin,ymin,xmax,ymax; break
# k=k+1
# return ret
#def Clic(event):
# global DETECTION_CLIC_SUR_OBJET, ret
# X= event.x
# Y= event.y
# print("Position du clic -> ",X,Y)
# ret=quel_Carre_Bouge(liste_Carre_Bouge,X,Y)
#if ret!=None:
#DETECTION_CLIC_SUR_OBJET=True
#k,xmin,ymin,xmax,ymax=ret
##print("Carre_Bouge n° %d"%(k+1)) pas besoin de formater !!
#print("Carre_Bouge n°",k+1)
#print("Position objet ->",xmin,ymin,xmax,ymax)
#else:
#DETECTION_CLIC_SUR_OBJET=False
#print("DETECTION_CLIC_SUR_OBJET ->",DETECTION_CLIC_SUR_OBJET )
#def Drag(event):
##Gestion de lévénement bouton gauche enfoncé
# X= event.x
# Y= event.y
# print("Position du pointeur ->",X,Y)
# 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 a jour de la position de l'objet (drag)
# if ret!=None:
# k,xmin,ymin,xmax,ymax=ret
# Canevas.coords(liste_Carre_Bouge[k],X-TailleCarre, Y-TailleCarre,X+TailleCarre,Y+TailleCarre)
#DETECTION_CLIC_OBJET = False
## Création de la fenêtre principale
Mafenetre = Tk()
Mafenetre.title("Le mot a trouver")
#Création d'un widget Canvas
Largeur= 500
Hauteur= 300
#TailleCarre=20
Canevas=Canvas(Mafenetre,width=Largeur,height=Hauteur,bg='White')
#Création de sept carrés alignés sur une ligne dans lesquels on va y mettre les lettres (ligne du haut). reste FIXE
CarreH1=Canevas.create_rectangle(40,100,80,140,fill='white',outline='black')
CarreH2=Canevas.create_rectangle(80,100,120,140,fill='white',outline='black')
CarreH3=Canevas.create_rectangle(120,100,160,140,fill='white',outline='black')
CarreH4=Canevas.create_rectangle(160,100,200,140,fill='white',outline='black')
CarreH5=Canevas.create_rectangle(200,100,240,140,fill='white',outline='black')
CarreH6=Canevas.create_rectangle(240,100,280,140,fill='white',outline='black')
CarreH7=Canevas.create_rectangle(280,100,320,140,fill='white',outline='black')
#Création de sept carrés alignés sur une ligne dans lesquels les lettres vont apparaître (ligne du bas); reste FIXE
CarreB1=Canevas.create_rectangle(40,200,80,240,fill='white',outline='black')
CarreB2=Canevas.create_rectangle(80,200,120,240,fill='white',outline='black')
CarreB3=Canevas.create_rectangle(120,200,160,240,fill='white',outline='black')
CarreB4=Canevas.create_rectangle(160,200,200,240,fill='white',outline='black')
CarreB5=Canevas.create_rectangle(200,200,240,240,fill='white',outline='black')
CarreB6=Canevas.create_rectangle(240,200,280,240,fill='white',outline='black')
CarreB7=Canevas.create_rectangle(280,200,320,240,fill='white',outline='black')
#Création de sept carrés alignés sur une ligne dans lesquels les lettres mélangées vont apparaître
#liste_Carre_Bouge=[]; x1=40;y1=200
#for k in range(7):
# x2=x1+40;y2=y1+40
# liste_Carre_Bouge.append(Canevas.create_rectangle(x1,y1,x2,y2,fill='white',outline='black'))
# x1=x2
# Création de quatre boutons
boutonGo = Button(Mafenetre,text='GO',width=5,height=2,command=Demarrer) #command=Demarrer
boutonGo.place(x=50,y=20)
boutonQuit = Button(Mafenetre,text='Quitter',width=5,height=2,command=Mafenetre.destroy) #command=Quitter
boutonQuit.place(x=300,y=20)
boutonReesayer = Button(Mafenetre,text='Réessayer',width=10,height=2) #command=Reessayer
boutonReesayer.place(x=400,y=210)
boutonMotSuivant = Button(Mafenetre,text='Mot suivant',width=10,height=2) #command=Passer_MotSuivant
boutonMotSuivant.place(x=400,y=110)
#La méthode bind() permet de lier un événement avec une fonction
#Canevas.bind('<Button-1>',Clic) #événement clic gauche (press)
#Canevas.bind('<B1-Motion>',Drag) #événement bouton gauche enfoncé (hold down)
#TailleCarre=20
#Canevas.focus_set() ## ça sert quoi ?
Canevas.pack(padx=10,pady=10)
Mafenetre.mainloop()
Hors ligne
#22 Le 19/05/2019, à 18:30
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
RECOUCOU
j'ai relu ce qu'elle doit faire. on n'est pas obligé de faire bouger quoi que ce soit !!!
il a donné un visuel à respecter :
on doit voir deux lignes de rectangles une en haut et une bas.
Celle du bas doit contenir les lettres.
j'ai pensé à mettre pour la ligne du haut des "entry"
on doit récupérer les lettres tapées dans ces entry et comparer avec le mot à trouver !!
et bien sûr au bout des 10 mots à trouver; il faut dire combien de mots il a trouvé et le temps mis !!
Hors ligne
#23 Le 19/05/2019, à 19:08
- pingouinux
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
Est-il obligatoire d'avoir un rectangle par lettre ? Sinon on peut se contenter de 2 rectangles, celui du bas contenant un mot en désordre, et celui du haut dans lequel on teste une solution.
Hors ligne
#24 Le 19/05/2019, à 19:37
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
non je ne pense pas
Hors ligne
#25 Le 19/05/2019, à 19:43
- Nat62
Re : SOS aide pour programmer "le mot à trouver" élève de seconde
on peut peut-être mettre en bas sept boutons dans lesquels on mettrait les lettres en cliqauant sur un autre bouton.
Et quand on cliquerait sur un bouton contenant une lettre; la lettre se mettrait dans le premier carré du dessus ainsi de suite.
Pour ramener une lettre dans un boutons; on clique sur un autre bouton...
J'ai trouvé ceci sur internet mais ça ne marche pas bien et il y a une grille qui apparaît dans le canevas !! il faut l'adapter mais je ne comprends pas tout ce qu'il fait !!!
from tkinter import * # importation de tous les modules
from random import * # fonction choice
from tkinter import messagebox # utilisation des messages
selected_letter = None
undo_stack = []
def apply_command(btn, label):
global selected_letter
saved_letter = selected_letter
lettre = btn['text']
btn.configure(text=' ', state='disable')
label['text'] = lettre
selected_letter = lettre
def _undo():
global selected_letter
selected_letter = saved_letter
btn.configure(text=lettre, state='normal')
label['text'] = ' '
return _undo
def do_select(btn):
global undo_item
x = len(undo_stack)
label = labels[x]
undo_stack.append( apply_command(btn, label) )
def do_undo():
global undo_item
if not len(undo_stack):
return
undo_stack.pop(-1)()
def cliquer(event):
"""fonction permettant de tracer la lettre dans le Canvas."""
global drapeau, cercle, abscase,ordcase, lettre
drapeau = 1
abscisse = event.x
ordonnee = event.y
abscase = abscisse/33 -0.15
ordcase = ordonnee/33 - 0.15
abscase =int(abscase) + 0.5
ordcase = int(ordcase) + 0.5
abscases = int(abscase)
ordcases= int(ordcase)
iid = canvas.create_text(abscase*33 ,ordcase*33 , text=selected_letter)
undo_stack.append(lambda: canvas.delete(iid))
def create_canvas(master):
w = Canvas(root, width=500, height=500)
for k in range(16):
w.create_line(0, 33*k+3, 500, 33*k+3, width=1)
w.create_line(33*k+3, 0, 33*k+3, 500, width=1)
return w
labels = []
root = Tk()
canvas = create_canvas(root)
frame = Frame(root)
L = ['A','A','A','A','A','A','A','A','A', 'B','B','C','C','D','D','D','E','E','E','E','E','E','E','E','E','E','E','E','E','E','E','F','F','G','G','H','H','I','I','I','I','I','I','I','I','J','K','L','L','L','L','L','M','M','M','N','N','N','N','N','N','O','O','O','O','O','O','P','P','Q','R','R','R','R','R','R','S','S','S','S','S','S','T','T','T','T','T','T','U','U','U','U','U','U','V','V','W','X','Y','Z']
def get_lettres():
letters = L[:]
pioche = []
for x in range(8):
ch = choice(letters)
pioche.append(ch)
letters.remove(ch)
return pioche
def do_pioche():
pioche = get_lettres()
for x, ch in enumerate(pioche):
btn = Button(frame, text=ch)
btn['command'] = lambda btn=btn: do_select(btn)
btn.grid(row=0, column=x)
label = Label(frame, text=' ')
label.grid(row=1, column=x)
labels.append(label)
canvas.grid(row = 0, column = 0)
frame.grid(row=1, column=0)
Button(root, text='undo', command=do_undo).grid(row = 3, column= 0)
canvas.bind("<Button-1>", cliquer)
Button(root, text ='pioche', command=do_pioche).grid(row = 3,column=1)
root.mainloop()
Hors ligne