besoin d'aide pour un programme

besoin d'aide pour un programme - Python - Programmation

Marsh Posté le 30-03-2017 à 21:31:42    

Bonjour à tous, voilà une amie et moi devons faire un programme scientifique. Mais nous avons un énorme problème malgré de nombreuses recherches. On veut créer un jeu sur les 20 acides aminées en mettant plusieurs images de ces acides et en insérant juste à côté un choix multiple ( un genre de check liste) qui en cliquant dessus nous montrera si la réponse correspond à la photo ( système de vérification).
Nous avons fait ce code en tkinter sur python 3 ( ci dessous) qui je vous l'accorde est déjà trop long mais surtout les images ne s'appliquent pas , le programme montre juste des cases de couleur.. Pouvez vous, nous aider à raccourcir ce code et surtout nous permettre de mettre plusieurs images?  Merci  :)  
 
 
 
 
from tkinter import *
 
fen1 = Tk()
 
# création d'un widget 'Canvas' contenant une image bitmap :
can1 = Canvas(fen1, width =160, height =160, bg ='white')
photo = PhotoImage(file ='ala.gif')
item = can1.create_image(80, 80, image =photo)
can2 = Canvas(fen1, width =160, height =160, bg ='black')
photo = PhotoImage(file ='leu.gif')
item = can2.create_image(100, 100, image =photo)
can3 = Canvas(fen1, width =160, height =160, bg ='blue')
photo = PhotoImage(file ='gly.gif')
item = can3.create_image(200, 200, image =photo)
can4 = Canvas(fen1, width =160, height =160, bg ='green')
photo = PhotoImage(file ='gly.gif')
item = can4.create_image(200, 200, image =photo)
can5 = Canvas(fen1, width =160, height =160, bg ='gold')
photo = PhotoImage(file ='gly.gif')
item = can5.create_image(200, 200, image =photo)
can6 = Canvas(fen1, width =160, height =160, bg ='magenta')
photo = PhotoImage(file ='gly.gif')
item = can6.create_image(200, 200, image =photo)
can7 = Canvas(fen1, width =160, height =160, bg ='#234567')
photo = PhotoImage(file ='gly.gif')
item = can7.create_image(200, 200, image =photo)
can8 = Canvas(fen1, width =160, height =160, bg ='#098765')
photo = PhotoImage(file ='gly.gif')
item = can8.create_image(200, 200, image =photo)
can9 = Canvas(fen1, width =160, height =160, bg ='#453627')
photo = PhotoImage(file ='gly.gif')
item = can9.create_image(200, 200, image =photo)
can10 = Canvas(fen1, width =160, height =160, bg ='#102938')
photo = PhotoImage(file ='gly.gif')
item = can10.create_image(200, 200, image =photo)
can11 = Canvas(fen1, width =160, height =160, bg ='#928374')
photo = PhotoImage(file ='gly.gif')
item = can11.create_image(200, 200, image =photo)
can12 = Canvas(fen1, width =160, height =160, bg ='#610384')
photo = PhotoImage(file ='gly.gif')
item = can12.create_image(200, 200, image =photo)
can13 = Canvas(fen1, width =160, height =160, bg ='#777777')
photo = PhotoImage(file ='gly.gif')
item = can13.create_image(200, 200, image =photo)
can14 = Canvas(fen1, width =160, height =160, bg ='#001234')
photo = PhotoImage(file ='gly.gif')
item = can14.create_image(200, 200, image =photo)
can15 = Canvas(fen1, width =160, height =160, bg ='#619247')
photo = PhotoImage(file ='gly.gif')
item = can15.create_image(200, 200, image =photo)
can16 = Canvas(fen1, width =160, height =160, bg ='#716354')
photo = PhotoImage(file ='gly.gif')
item = can16.create_image(200, 200, image =photo)
can17 = Canvas(fen1, width =160, height =160, bg ='#840294')
photo = PhotoImage(file ='gly.gif')
item = can17.create_image(200, 200, image =photo)
can18 = Canvas(fen1, width =160, height =160, bg ='#386334')
photo = PhotoImage(file ='gly.gif')
item = can18.create_image(200, 200, image =photo)
can19 = Canvas(fen1, width =160, height =160, bg ='#046384')
photo = PhotoImage(file ='gly.gif')
item = can19.create_image(200, 200, image =photo)
can20 = Canvas(fen1, width =160, height =160, bg ='#105384')
photo = PhotoImage(file ='gly.gif')
item = can20.create_image(200, 200, image =photo)
# Mise en page à l'aide de la méthode 'grid' :
can1.grid(row =1, column =1, rowspan =3, padx =[0,100], pady =5)
can2.grid(row =10, column =1, rowspan =3, padx =[0,100], pady =5)
can3.grid(row =20, column =1, rowspan =3, padx =[0,100], pady =5)
can4.grid(row =30, column =1, rowspan =3, padx =[0,100], pady =5)
can5.grid(row =40, column =1, rowspan =3, padx =[0,100], pady =5)
can6.grid(row =1, column =2, rowspan =3, padx =[100,200], pady =5)
can7.grid(row =10, column =2, rowspan =3, padx =[100,200], pady =5)
can8.grid(row =20, column =2, rowspan =3, padx =[100,200], pady =5)
can9.grid(row =30, column =2, rowspan =3, padx =[100,200], pady =5)
can10.grid(row =40, column =2, rowspan =3, padx =[100,200], pady =5)
can11.grid(row =1, column =3, rowspan =3, padx =[0,200], pady =5)
can12.grid(row =10, column =3, rowspan =3, padx =[0,200], pady =5)
can13.grid(row =20, column =3, rowspan =3, padx =[0,200], pady =5)
can14.grid(row =30, column =3, rowspan =3, padx =[0,200], pady =5)
can15.grid(row =40, column =3, rowspan =3, padx =[0,200], pady =5)
can16.grid(row =1, column =4, rowspan =3, padx =[0,200], pady =5)
can17.grid(row =10, column =4, rowspan =3, padx =[0,200], pady =5)
can18.grid(row =20, column =4, rowspan =3, padx =[0,200], pady =5)
can19.grid(row =30, column =4, rowspan =3, padx =[0,200], pady =5)
can20.grid(row =40, column =4, rowspan =3, padx =[0,200], pady =5)
 
# démarrage :
fen1.mainloop()

Reply

Marsh Posté le 30-03-2017 à 21:31:42   

Reply

Marsh Posté le 31-03-2017 à 09:33:39    

Utilise les balise [ code ] [ /code ] (sans les espaces) pour que ton code soit plus lisible.
 
Le problème ici c'est que tes image sont "garbage collected". Sans entrer dans les détails, python a l'impression que tu n'as plus besoin des images et les supprime de la mémoire.
 
Pour éviter cela tu peux renommer ta variable "photo" en photo1, photo2 ... etc
 
Je reviendrai plus tard sur la longueur du code et manière de coder cela plus propre.


---------------
sheep++
Reply

Marsh Posté le 31-03-2017 à 09:56:57    

Pour la longueur du code, le soucis qui se pose c'est que tu mélange des données au code.
 
Le mieux est de définir les données à part, puis de les utiliser pour construire ta fenêtre.
C'est assez facile dans ton cas car le code est très répétitif.
En plus court ça donne:

Code :
  1. from Tkinter import *
  2.  
  3. # Layout informations
  4. imagesLayout = [
  5.        {'file':'redface.gif',  'background':'white',   'grid' : (1, 1), 'padx':[0,100]},
  6.        {'file':'biggrin.gif',  'background':'black',   'grid' : (10,1), 'padx':[0,100]},
  7.        {'file':'gzk.gif',      'background':'blue',    'grid' : (20,1), 'padx':[0,100]},
  8.        {'file':'gzk.gif',      'background':'green',   'grid' : (30,1), 'padx':[0,100]},
  9.        {'file':'gzk.gif',      'background':'green',   'grid' : (40,1), 'padx':[0,100]},
  10.        {'file':'redface.gif',  'background':'white',   'grid' : (1, 2), 'padx':[100,200]},
  11.        {'file':'biggrin.gif',  'background':'black',   'grid' : (10,2), 'padx':[100,200]},
  12.        {'file':'gzk.gif',      'background':'blue',    'grid' : (20,2), 'padx':[100,200]},
  13.        {'file':'gzk.gif',      'background':'green',   'grid' : (30,2), 'padx':[100,200]},
  14.        {'file':'gzk.gif',      'background':'green',   'grid' : (40,2), 'padx':[100,200]},
  15.    ]
  16.  
  17. # Store data to prevent garbage collection
  18. canvas_Refs = []
  19. photos_Refs = []
  20.  
  21. fen1 = Tk()
  22.  
  23. # Create canvas
  24. for image in imagesLayout:
  25.    canvas = Canvas(fen1, width=160, height=160, bg=image['background'])
  26.    photo  = PhotoImage(file=image['file'])
  27.    canvas.create_image(80, 80, anchor=CENTER, image=photo)
  28.    canvas.grid(row=image['grid'][0], column=image['grid'][1], rowspan=3, padx=image['padx'], pady=5)
  29.  
  30.    #store references to prevent garbage collection
  31.    canvas_Refs.append(canvas)
  32.    photos_Refs.append(photo)
  33.  
  34. # Start :
  35. fen1.mainloop()


Message édité par h3bus le 31-03-2017 à 09:59:04

---------------
sheep++
Reply

Marsh Posté le 31-03-2017 à 17:03:19    

Ok merci bien , je vais voir ce que ça donne :)

Reply

Sujets relatifs:

Leave a Replay

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