1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| #!/usr/bin/python
# -*- coding: utf8 -*-
from tkinter import* # Importation du module tkinter
import PIL.Image
import PIL.ImageTk # Module PIL (traitement des images importées)
import tkinter.messagebox
import tkinter.filedialog
class Plan_potager(object) :
"Classe instanciant la page 'Photothèque'"
def __init__(self, cadre, couleur):
"Méthode constructeur"
self.cadre = cadre
self.couleur = couleur # Correspond à la couleur des onglets et de l'application choisie par l'utilisateur.
self.boutons_photos = []
self.chemins = []
def serre(self, import_photos):
"Méthode qui affiche les photos de la serre sélectionnée"
self.boutons_photos = []
self.chemins = []
for self.can in self.cadre.winfo_children():
self.can.destroy()
self.can = Canvas(self.cadre, height=800, width=1279, bg='white', highlightthickness=0)
self.can.grid(row=0)
self.can.grid_propagate(0)
onglets = LabelFrame(self.can)
onglets.grid(padx= 450, row = 0, sticky ='w')
self.boutons = LabelFrame(self.can,bg='white',fg='black',bd=2,relief='ridge', width = 150)
self.boutons.grid(row = 0, column = 0, padx = 30, pady = 20)
self.ajout_photo=Button(self.boutons,text='Importer une photo',font='Times 16',bg=self.couleur[1],fg='white',bd=2 , relief='ridge', command=lambda:self.importer(import_photos))
self.ajout_photo.grid(padx=1, pady=1)
self.detruire_photo = Button(self.boutons,text='Supprimer une photo',font='Times 16',bg=self.couleur[1],fg='white',bd=2 , relief='ridge', command = lambda:self.supprimer(import_photos))
self.detruire_photo.grid(row=0, column=1, padx=1, pady=1)
self.can2 = Canvas(self.can, height = 600, width = 1250, bg='white', bd=0, relief='ridge', highlightthickness=0)
self.can2.grid(row=1, column = 0, padx = 20, sticky='n')
self.fichier = open(import_photos, 'r')
self.inserer_photos = self.fichier.readlines()
for i in range (0, len(self.inserer_photos)) :
self.chemins.append(self.inserer_photos[i])
self.image = PIL.Image.open(self.inserer_photos[i].strip())
self.image2 = PIL.Image.open(self.inserer_photos[i].strip())
self.photo = Boutons_photos(self.cadre, self.can2, self.image, self.image2, i, self.couleur) # Création des objets boutons-photos
self.photo.creation_bouton() #Appel de la méthode de création des boutons-photos
def importer(self, import_photos):
"Méthode permettant d'importer des photos"
self.chemin = tkinter.filedialog.askopenfilename(title="Importer une image",filetypes=[('png files','.png'),('all files','.*')])
self.image = PIL.Image.open(self.chemin)
self.photo = PIL.ImageTk.PhotoImage(self.image)
self.fichier = open(import_photos, 'a')
self.fichier.write(self.chemin + '\n')
self.fichier.close()
self.serre(import_photos) # Appel de la méthode serre après avoir chargé la nouvelle photo
def supprimer(self, import_photos) :
"Méthode permettant de supprimer des photos"
self.info = tkinter.messagebox.showinfo('Supprimer une photo', 'Cliquer sur la photo que vous souhaitez supprimer')
a = 0
for self.bouton_photo in self.can2.winfo_children() :
self.sous_liste = [] # Création d'une sous-liste pour attribuer un numéro à chaque bouton-photo.
self.sous_liste.append(a) # Attribution du numéro
a+=1 # Incrémentation
self.sous_liste.append(self.bouton_photo) # Rajout du bouton-photo à la sous-liste
self.boutons_photos.append(self.sous_liste) # Rajout de la sous-liste à la liste self.boutons_photos
for i in range(0, len(self.boutons_photos)):
# Création des objets Detruire
self.detruire = Detruire(self.cadre, self.chemins, self.boutons_photos, self.boutons_photos[i], import_photos, self.couleur) #Transformation de la liste self.boutons_photos en tuple
self.detruire.dictionnaire_boutons_photos()
class Boutons_photos(Plan_potager) :
"Sous-classe instanciant les 'boutons-photos' et les photos en taille originale"
def __init__(self, cadre, can2, image, image2, i, couleur) :
"Méthode constructeur"
Plan_potager.__init__(self, cadre, couleur)
self.can2 = can2
self.image = image
self.image2 = image2
self.i = i
def creation_bouton(self) :
"Méthode de création des 'boutons-photos'"
self.size = 256, 256
self.image.thumbnail(self.size)
self.photo = PIL.ImageTk.PhotoImage(self.image)
self.mini_photo = Button(self.can2, bg='white', bd=0, image=self.photo, activebackground='green', cursor='hand2', command=self.photo_agrandie)
self.mini_photo.grid(row=1, column = self.i, padx=10, sticky='ne')
def photo_agrandie(self) :
"Méthode permettant d'agrandir les photos"
self.grande_photo = Toplevel()
self.photo2 = PIL.ImageTk.PhotoImage(self.image2)
self.label_photo = Label(self.grande_photo, image = self.photo2)
self.label_photo.grid()
class Detruire(Plan_potager) :
"Sous-classe permettant de détruire les boutons-photos"
def __init__(self, cadre, chemins, boutons_photos, bouton_photo, import_photos, couleur) :
"Méthode constructeur"
Plan_potager.__init__(self, cadre, couleur)
self.chemins = chemins
self.boutons_photos = boutons_photos
self.bouton_photo = bouton_photo # TUPLE (1, <tkinter.Button object at 0xb5ee780c>
self.import_photos = import_photos
self.dico = {}
def dictionnaire_boutons_photos(self) :
"Méthode de création du dictionnaire {boutons_photos : chemins}"
# TO-DO LISTE :
# - Impossible de détruire deux photos à la suite. Il faut refermer l'application à chaque fois car le self.bouton_photo est détruit
for i in range(0, len(tuple(self.boutons_photos))):
self.boutons_photos[i] = tuple(self.boutons_photos[i]) #Transformation de la sous-liste en tuple [(),()]
self.dico[self.boutons_photos[i]] = self.chemins[i] # Attribution du chemin à chaque bouton-photo
self.bouton_photo[1].bind('<1>', self.destruction) #Le clic droit sur le bouton-photo déclenche l'événement destruction
def destruction(self, event) :
"Méthode permettant de détruire le bouton_photo et d'effacer le chemin dans le fichier .txt"
#TO-DO LISTE :
# - if self.oui_non == False or None
self.oui_non = tkinter.messagebox.askyesnocancel('supprimer la photo?', 'Souhaitez-vous vraiment supprimer cette photo?') #Message avant suppression définitive
if self.oui_non == False or self.oui_non == None :
self.serre(self.import_photos)
elif self.oui_non == True :
self.bouton_photo[1].destroy() #self.bouton est un tuple du type ((0, <tkinter.Button object at 0xb5fb19cc>),)
for clef in tuple(self.dico) : # Boucle sur les clés du dictionnaire transformé en tuple
if self.bouton_photo[0] == clef[0] : #Si le n° du bouton-photo est égal au numéro contenu dans la clé :
del self.dico[clef] # Effacement de la clé et de sa valeur correspondante dans le dictionnaire:
#{(1, <tkinter.Button object at 0xb5ee780c>): '/home/benoit/Documents/Python/mon_jardin_2.0/page_accueil.png\n'}
self.fichier = open(self.import_photos, 'w') # Ouverture du fichier-photos et effacement de toutes les données
self.fichier.close() # Fermeture du fichier
self.fichier = open(self.import_photos, 'a') # Réouverture du fichier en mode ajout ('a')
for clef in self.dico: # Boucle pour réécrire les nouvelles données
self.fichier.write(self.dico[clef]) #Ecriture dans le fichier de chaque valeur contenue dans le dictionnaire, à savoir les chemins des photos
self.fichier.close() # Fermeture du fichier
self.serre(self.import_photos) |
Partager