Besoin d'aide Tkinter pour l'isn

Besoin d'aide Tkinter pour l'isn - Python - Programmation

Marsh Posté le 19-05-2017 à 00:30:15    

Bonjour, moi et mes partenaires nous avons besoin d'aide pour notre isn .  
Dans mon mémory j'ai intégré un chronomètre mais je n'arrive pas à le placer ou je veux pour qu'il soit visible . (voir la flèche)  
 
Merci de bien vouloir nous aider parce que nous sommes dans une impasse et je trouve ça dommage de laisser tomber ce chronomètre .
 
L'image :  
https://image.prntscr.com/image/efbf3b5e349e40d695f751abd3bcc91b.png
 
Le code :  

Code :
  1. from tkinter import *
  2. from random import randint, shuffle
  3. from timeit import default_timer
  4. # ----- variables globales ---------------------------------------------------
  5. images = []         # contient les liens aux fichiers images
  6. cartes = []         # contient le lien vers l'image des différentes cartes
  7. cartes_jouees = []  # contient les cartes jouées
  8. nb_lignes, nb_colonnes = 5, 4
  9. joueur_actuel = 0
  10. score = [0,0]
  11. fini = False
  12. peut_jouer = True
  13. # ----- Images ----------------------------------------------------------------
  14. def charger_images():
  15.     del images[:]   # vide la liste
  16.     nb_images = 21  # l'image no 0 est le dos des cartes
  17.     choixCartes = []
  18.     choixCartes.append(0)#ajouter un element a la fin de la liste
  19.     i=0
  20.     while i < nb_images-1:           # tirage au sort des cartes à utiliser
  21.         x = randint(1, nb_images-1)  #randomint pour le tirage aleatoire
  22.         if x not in choixCartes:
  23.             choixCartes.append(x)
  24.             i += 1
  25.     for i in range(nb_images):           # importation des images
  26.         nom = 'carte-' + str(choixCartes[i]) + '.gif'
  27.         image = PhotoImage(file = nom)
  28.         images.append(image)
  29. # ----- Melange des cartes -----------------------------------------------------
  30. def melanger_cartes():
  31.     global nb_colonnes, nb_lignes, cartes
  32.     nb_cartes = nb_colonnes * nb_lignes
  33.     cartes=list(range(1,nb_cartes//2+1))*2
  34.     shuffle(cartes) #melange dans cartes
  35. # ----- Retourne les deux cartes à la fin de la sélection ----------------------
  36. def gerer_tirage():
  37.     global nb_colonnes, nb_lignes, cartes_jouees
  38.     global joueur_actuel, fini, peut_jouer
  39.     if cartes[cartes_jouees[0]-1] == cartes[cartes_jouees[1]-1]:
  40.         # enlève les cartes identiques. Le joueur actuel reste le même
  41.         canvas.delete(cartes_jouees[0])
  42.         canvas.delete(cartes_jouees[1])
  43.         score[joueur_actuel] += 1
  44.     else:
  45.         # retourne les cartes différentes. Le joueur actuel change
  46.         canvas.itemconfig(cartes_jouees[0], image = images[0])
  47.         canvas.itemconfig(cartes_jouees[1], image = images[0])
  48.     cartes_jouees = []
  49.     text1 = 'Joueur 1 : ' + str(score[0]*2)
  50.     points_joueur1.config(text = text1)
  51.     peut_jouer = True           # réactive l'effet du clic de la souris
  52.     if joueur_actuel == 0:      # celui qui joue est en orange
  53.         points_joueur1.config(bg = 'orange')
  54.     else:
  55.         points_joueur1.config(bg = 'white')
  56.     if score[0] + score[1] == (nb_colonnes*nb_lignes)//2:
  57.         fini=True               # afficher le résultat de la partie
  58.         if score[0] > score[1]:
  59.             texte = "Facile non ?"
  60.         canvas.create_rectangle(0,0,(110*nb_colonnes)+20,(110*nb_lignes)+20,
  61.                                 fill='white')
  62.         canvas.create_text((55*nb_colonnes)+10,(55*nb_lignes)+10,
  63.                            text=texte,font='Calibri 24',fill='black')
  64. # ----- Retourne la carte sélectionnée -----------------------------------------
  65. def cliquer_carte(event):
  66.     global fini, plateau, cartes_jouees, peut_jouer
  67.     if len(cartes_jouees) < 2:
  68.         carteSel = canvas.find_closest(event.x, event.y)
  69.         carteID = carteSel[0]
  70.         if fini:
  71.             fini = False
  72.             reinit()
  73.         else:
  74.             canvas.itemconfig(carteID, image = images[cartes[carteID-1]]) # montre la carte
  75.             if len(cartes_jouees) == 0:
  76.                 cartes_jouees.append(carteID)    # enregistre la carte jouée
  77.             elif carteID != cartes_jouees[0]:    # ne pas cliquer 2x sur la même carte !
  78.                 cartes_jouees.append(carteID)
  79.     if peut_jouer and len(cartes_jouees) == 2:
  80.         peut_jouer = False                  # désactive l'effet du clic de la souris
  81.         plateau.after(1500,gerer_tirage)    # patiente 1,5 secondes avant de continuer
  82. # -----  Change la taille du plateau de jeu  -------------------------------------
  83. def jeu5x4():
  84.     global nb_colonnes
  85.     nb_colonnes = 4
  86.     reinit()
  87. def jeu5x6():
  88.     global nb_colonnes
  89.     nb_colonnes = 6
  90.     reinit()
  91. def jeu5x8():
  92.     global nb_colonnes
  93.     nb_colonnes = 8
  94.     reinit()
  95. # ----- création des menus et sous-menus ------------------------------------------
  96. def creer_menus(fen):
  97.     top = Menu(fen)
  98.     fen.config(menu=top)
  99.     jeu = Menu(top, tearoff=False)
  100.     top.add_cascade(label='Jeu', menu=jeu)
  101.     jeu.add_command(label='Nouvelle partie', command=reinit)
  102.     submenu=Menu(jeu, tearoff=False)
  103.     jeu.add_cascade(label='Dimensions', menu=submenu)
  104.     submenu.add_command(label='5 x 4', command=jeu5x4)
  105.     submenu.add_command(label='5 x 6', command=jeu5x6)
  106.     submenu.add_command(label='5 x 8', command=jeu5x8)
  107.     jeu.add_command(label='Quitter', command=fen.destroy)
  108. # ----- Création du canvas --------------------------------------------------------
  109. def creer_canevas(fen, col, lig):
  110.     return Canvas(fen, width=(110*col)+10, height=(110*lig)+10, bg='white')
  111. # ----- Modifier le canvas --------------------------------------------------------
  112. # Redémarre une partie et change éventuellement la difficulté
  113. def reinit():
  114.     global canvas, joueur_actuel, score, nb_lignes, nb_colonnes
  115.     joueur_actuel = 0
  116.     score =[0,0]
  117.     del cartes[:]
  118.     del cartes_jouees[:]
  119.     canvas.destroy()
  120.     canvas = creer_canevas(plateau, nb_colonnes, nb_lignes)
  121.     canvas.pack(side = TOP, padx = 5, pady = 5)
  122.     canvas.bind("<Button-1>", cliquer_carte)    # permet le clic sur les cartes
  123.     melanger_cartes()
  124.     for i in range(nb_colonnes):                # dessin des cartes retournées
  125.         for j in range(nb_lignes):
  126.             canvas.create_image((110*i)+60, (110*j)+60, image=images[0])
  127.     text1 = 'Joueur 1 : ' + str(score[0]*2)
  128.     points_joueur1.config(text = text1, bg = 'orange')
  129. # ----- Programme principal ----------------------------------------------------
  130. fenetre = Tk()
  131. fenetre.title("Memory" )
  132. creer_menus(fenetre)
  133. # création du canvas dont la taille dépend du nombre de cartes
  134. plateau = Frame(fenetre)
  135. plateau.pack()
  136. canvas=creer_canevas(plateau, nb_colonnes, nb_lignes)
  137. canvas.pack(side = TOP, padx = 2, pady = 2)
  138. points_joueur1 = Label(fenetre, text = "Joueur 1 : 0",
  139.                        bg="orange", font="Helvetica 16" )
  140. points_joueur1.pack(pady = 2, side = LEFT)
  141. charger_images()
  142. melanger_cartes()
  143. for i in range(nb_colonnes):                # dessin des cartes retournées
  144.     for j in range(nb_lignes):
  145.         canvas.create_image((110*i)+60, (110*j)+60, image = images[0])
  146. canvas.bind("<Button-1>", cliquer_carte)    # permet le clic sur les cartes
  147. def updateTime():
  148.      now = default_timer() - start
  149.      minutes, seconds = divmod(now, 60)
  150.      hours, minutes = divmod(minutes, 60)
  151.      str_time = "%d:%02d:%02d" % (hours, minutes, seconds)
  152.      canvas.itemconfigure(text_clock, text=str_time)
  153.      fenetre.after(1000, updateTime)
  154. start = default_timer()
  155. text_clock = canvas.create_text(60,60)
  156. updateTime()
  157. fenetre.mainloop()

Reply

Marsh Posté le 19-05-2017 à 00:30:15   

Reply

Marsh Posté le 20-05-2017 à 19:12:47    

Salut :)
 
J'apprends tkinter, donc, je ne saurais t'aider précisément.
 
Premièrement, vous êtes vraiment obligés d'utiliser global ? Parce que, généralement, la première réaction quand on voit ce mot (et ça s'empire lorsqu'il est présent souvent) c'est [:vomi]
 
Pour en revenir à ta demande, vous pourriez coupez la fenêtre en 2 frames. La première qui encadre les 20 cartes, la seconde, en dessous, qui encadre "JOUEUR 1 : " et le chrono. Tu actives l'option resizable (ou un truc dans le genre), en adaptant l'agrandissement/rétrécissement de la fenêtre. Tu mets W(est) à l'option sticky de l'emplacement ton chrono. Vu la flèche, on dirait que vous ne le voulez pas tout à droite. Bien, tu émarges de quelques pixels (je crois que c'est l'option margin, ou xmargin, pas certain).
 
Enfin, tu peux te baser sur ce tuto en réadaptant car vous êtes en Python3 (donc tkinter), le tuto en Python2 (donc Tkinter) et vous n'êtes pas en POO, alors que c'est le cas pour le tuto.
 
Ça veut dire quoi isn ?

Reply

Marsh Posté le 20-05-2017 à 20:36:49    

Tout d'abord merci de la réponse .  
 
Isn ou informatique et science du numérique  est une spécialité en terminale ( scientifique pour moi ) où nous devons pour la fin de l’année programmer quelque chose pour le présenter devant un jury de deux personnes (notre professeur d'isn et une autre de svt dans mon cas) . Je dois m'occuper d'un memory et mes deux amis d'un simon . Le problème c'est que pour l'oral nous avons un dossier à rendre en même temps que l'oral , ce qui implique un programme fini donc il nous reste très peu de temps (passage mardi ) .
 
Je vais étudier vos propositions ( quitte à ne pas les mettre en pratique mais au moins les connaitre pour les expliquer devant le jury pour montrer une éventuelle évolution )  
 
Pour quand même rendre le chrono utilisable j'ai adapté le canvas pour avoir plus de place dans le but d' intégrer le chrono .
 
résultat :  
https://image.prntscr.com/image/4318dff3ac6540c9b927ff82c330aae8.png

Reply

Marsh Posté le 20-05-2017 à 22:40:15    

Aussi, vous devriez vous créer un dossier avec le projet complet. J'ai voulu tester, mais, forcément, il manque des fichiers :
 

Code :
  1. Traceback (most recent call last):
  2.   File "shartoMemoryCard.py", line 141, in <module>
  3.     charger_images()
  4.   File "shartoMemoryCard.py", line 27, in charger_images
  5.     image = PhotoImage(file = nom)
  6.   File "/opt/python3.5.2/lib/python3.5/tkinter/__init__.py", line 3394, in __init__
  7.     Image.__init__(self, 'photo', name, cnf, master, **kw)
  8.   File "/opt/python3.5.2/lib/python3.5/tkinter/__init__.py", line 3350, in __init__
  9.     self.tk.call(('image', 'create', imgtype, name,) + options)
  10. _tkinter.TclError: couldn't open "carte-0.gif": no such file or directory


 
J'ai enregistré le fichier (un copier-coller) en "shartoMemoryCard.py", mais, il me manque carte-0.gif.
C'est pas bon, si les examinateurs veulent tester sur leurs ordis.

Reply

Marsh Posté le 20-05-2017 à 23:15:30    

Bien évidement j'ai un dossier complet mais dans le doute je ne l'avais pas posté .
Comment puis je partager le dossier ?

Reply

Marsh Posté le 21-05-2017 à 11:14:29    

Salut :)
 
Si le dossier fait moins de 15 MB, tu peux le poster via http://www.cjoint.com/
 
J'ai lu ton programme, il a l'air pas mal (malgré les global). Mais, n'y a-t-il pas moyen de rendre les cartes comme étant des boutons customisés. En procédant ainsi, tu mets les actions possibles dans la fonction appelé par l'option command du widget Button. Le problème c'est que de tête ça ferait une fonction par carte-bouton, donc, 20 fonctions. Mon idée n'est peut-être pas si bonne que ça.
 

Reply

Marsh Posté le 21-05-2017 à 18:40:36    

Bon le site proposé ne permets pas de partagé un dossier , voici un lien google drive : https://drive.google.com/drive/fold [...] HdPYjdrSzA
 
Sinon ton idée est très intéressante à étudier

Reply

Marsh Posté le 22-05-2017 à 10:29:51    

Salut :)
 
Merci pour le partage, et désolé, je ne pouvais pas voir plus tôt.
 
Bien, j'ai 2 remarques pour la partie chrono :
- le chrono se lance dès l'exécution du code. Il faudrait lancer le chrono dès le premier clic sur une carte ;
- lorsqu'on clique "Nouvelle Partie", il n'y a plus de chrono
 

Reply

Marsh Posté le 22-05-2017 à 14:59:55    

Merci à toi pour ton aide :).
 
C'est vrai que lancer le chrono des que le joueur commence serait plus logique . Pour Le chrono qui n’apparaît pas à la nouvelle partie j'ai aussi remarqué le problème mais je ne vois pas trop comment le relancer sauf peut être un changement dans la partie du programme chargée de relancer en nouvelle partie  .

Reply

Marsh Posté le 22-05-2017 à 15:08:42    

Oui voilà, j'ai vu que tu avais réinitialisé les cartes dans le code. Tu devrais faire pareil pour le chrono.
 
Si fini et si utilisateur clique sur "nouvelle partie" alors
    chrono à 0
    ...
 
Un truc dans le genre.
 
Si je ne t'aide pas plus, c'est pas pour pas te mâcher le taff, mais, parce que je ne peux pas beaucoup plus à mon niveau.

Reply

Marsh Posté le 22-05-2017 à 15:08:42   

Reply

Marsh Posté le 22-05-2017 à 16:25:09    

Ne t’inquiète pas c'est déjà vraiment sympa d'aider .


Message édité par sharto le 22-05-2017 à 16:38:56
Reply

Marsh Posté le 25-05-2017 à 14:54:44    

Salut :)
 
Comment ça s'est passé ?
 
J'ai découvert des idées, mais, malheureusement, après ton passage. Je n'ai pas jugé utile de t'en parler car je ne sais pas quel avenir tu donnes à la prog.

Reply

Marsh Posté le 25-05-2017 à 19:23:17    

Salut , j'ai dans l'ensemble réussi l'oral et mon prof a aimé mon programme juste une remarque sur mon dossier " pas assez consistant " ce qui est dommage puisque j'ai prix exemple sur un dossier qu'il m'avait donné .
 
Pour le programme je pense le garder de coté si un jour une quelconque motivation me pousse à le perfectionner , encore merci de ton aide .

Reply

Marsh Posté le 25-05-2017 à 21:01:34    

Ok, si tu as besoin de ce que j'ai découvert, n'hésite pas.
 
Il se peut que j'en oublie voire que je traîne à les retrouver, car c'est du vrac et il y a un beau bordel dans mes marque-pages.
 
En revanche, je trouve dommage qu'il n'ait pas fait de remarque sur l'utilisation du mot clé global. Peut-être était-il conscient du niveau demandé. D'après le cours de Swinnen, il faudrait faire de la POO pour éviter global.
 
Bravo en tout cas :)

Reply

Marsh Posté le 26-05-2017 à 02:06:45    

J'ai évoqué le fait qu''il ai des global du coup il ma demandé que langage peut servir d'alternative sur le coup j'ai pas tilt , la réponse --> le langage objet .

Reply

Marsh Posté le 26-05-2017 à 22:00:31    

Salut :)
 
C'est, je trouve, mal dit de sa part car on parle plus de paradigme (façon de faire) objet que de langage objet.
 
C'est toi qui as donné la réponse ou c'est lui ?

Reply

Marsh Posté le 26-05-2017 à 23:24:38    

C'est lui car lorsque qu'il ma parlé de language j'ai plus cherche un language comme java ect que le langage objet

Reply

Marsh Posté le 27-05-2017 à 18:48:22    

Désolé du double post mais j'ai eu ma note : 14 au dossier 16 au projet .

Reply

Marsh Posté le 27-05-2017 à 19:03:56    

Pas mal :)
 
J'avais pensé à 15 environ en plus.

Reply

Marsh Posté le 27-05-2017 à 20:04:25    

J’espérais personnellement un petit 16 mais je suis satisfait  :)  
Merci encore et peut être à une prochaine fois .

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed