Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1487 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Besoin d'aide Tkinter pour l'isn

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'aide Tkinter pour l'isn

n°2300887
sharto
Posté le 19-05-2017 à 00:30:15  profilanswer
 

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()

mood
Publicité
Posté le 19-05-2017 à 00:30:15  profilanswer
 

n°2300992
tomsawyer1​311
Posté le 20-05-2017 à 19:12:47  profilanswer
 

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 ?

n°2300997
sharto
Posté le 20-05-2017 à 20:36:49  profilanswer
 

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

n°2301007
tomsawyer1​311
Posté le 20-05-2017 à 22:40:15  profilanswer
 

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.

n°2301010
sharto
Posté le 20-05-2017 à 23:15:30  profilanswer
 

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

n°2301016
tomsawyer1​311
Posté le 21-05-2017 à 11:14:29  profilanswer
 

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.
 

n°2301024
sharto
Posté le 21-05-2017 à 18:40:36  profilanswer
 

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

n°2301034
tomsawyer1​311
Posté le 22-05-2017 à 10:29:51  profilanswer
 

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
 

n°2301050
sharto
Posté le 22-05-2017 à 14:59:55  profilanswer
 

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  .

n°2301052
tomsawyer1​311
Posté le 22-05-2017 à 15:08:42  profilanswer
 

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.

mood
Publicité
Posté le 22-05-2017 à 15:08:42  profilanswer
 

n°2301059
sharto
Posté le 22-05-2017 à 16:25:09  profilanswer
 

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


Message édité par sharto le 22-05-2017 à 16:38:56
n°2301141
tomsawyer1​311
Posté le 25-05-2017 à 14:54:44  profilanswer
 

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.

n°2301147
sharto
Posté le 25-05-2017 à 19:23:17  profilanswer
 

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 .

n°2301149
tomsawyer1​311
Posté le 25-05-2017 à 21:01:34  profilanswer
 

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 :)

n°2301161
sharto
Posté le 26-05-2017 à 02:06:45  profilanswer
 

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 .

n°2301193
tomsawyer1​311
Posté le 26-05-2017 à 22:00:31  profilanswer
 

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 ?

n°2301194
sharto
Posté le 26-05-2017 à 23:24:38  profilanswer
 

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

n°2301211
sharto
Posté le 27-05-2017 à 18:48:22  profilanswer
 

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

n°2301212
tomsawyer1​311
Posté le 27-05-2017 à 19:03:56  profilanswer
 

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

n°2301215
sharto
Posté le 27-05-2017 à 20:04:25  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Besoin d'aide Tkinter pour l'isn

 

Sujets relatifs
Aide fichier batch - Automatisatisation requette [NotePad++ ] Aide Projet Bac ISN
aide code source c++utilisation de Tkinter
besoin d'aide pour un programmeSVP besoin de votre aide pour création application!
Aide Programmation pythonBesoin d'un coup de main (fonction strftime)
Besoin d'aide pour l'interface graphique TKINTER du langage python 
Plus de sujets relatifs à : Besoin d'aide Tkinter pour l'isn


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR