IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Supprimer une photo et son chemin dans un fichier .txt [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Kaa'dem-2072
    Homme Profil pro
    Biogärtner
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Biogärtner
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Par défaut Supprimer une photo et son chemin dans un fichier .txt
    Bonjour,

    Dans le programme que je suis en train d'écrire, j'ai fait une sorte de photothèque. J'ai chargé des photos miniatures qui apparaissent dans des widgets Button. Je peux agrandir les photos en cliquant dessus.
    Le chemin des photos est stocké dans un fichier txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /home/benoit/Documents/Python/mon_jardin_2.0/serre2_1.png
    /home/benoit/Documents/Python/mon_jardin_2.0/serre2_2.png
    /home/benoit/Documents/Python/mon_jardin_2.0/serre2_3.png
    J'ai créé un bouton "supprimer une photo" pour pouvoir faire cette opération à ma guise. Pas de problème pour rédiger le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	def destruction(self, event) :
    		self.oui_non = tkinter.messagebox.askyesnocancel('supprimer la photo?', 'Souhaitez-vous vraiment supprimer cette photo?')
    		if self.oui_non == True :
    			self.bouton.destroy()
    Mais bien évidemment, il faut aussi que j'efface la ligne correspondante dans le fichier txt. Si par exemple je détruis la deuxième photo, il faut que j'efface : /home/benoit/Documents/Python/mon_jardin_2.0/serre2_2.png.
    Je sais qu'il faudra que je parcoure ce fichier txt à l'aide d'un "readline". Mais mon problème, c'est que j'ignore comment récupérer cette ligne : /home/benoit/Documents/Python/mon_jardin_2.0/serre2_2.png.

    Quelqu'un pourrait-il m'aiguiller?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    Salut,

    Citation Envoyé par Kaa'dem-2072 Voir le message
    Mais bien évidemment, il faut aussi que j'efface la ligne correspondante dans le fichier txt. Si par exemple je détruis la deuxième photo, il faut que j'efface : /home/benoit/Documents/Python/mon_jardin_2.0/serre2_2.png.
    Je sais qu'il faudra que je parcoure ce fichier txt à l'aide d'un "readline". Mais mon problème, c'est que j'ignore comment récupérer cette ligne : /home/benoit/Documents/Python/mon_jardin_2.0/serre2_2.png.
    Ben, il faut créer une association entre la "photo" et le nom du fichier correspondant. Et les dictionnaires sont faits pour çà.
    note: vous pouvez avoir un dictionnaire global qui associe photo à fichier ou créer cette association dans une classe Photo qui aurait pour attribut fichier, images,... Dans votre cas, sans montrez plus de code difficile à dire ce qui serait le plus simple.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de Kaa'dem-2072
    Homme Profil pro
    Biogärtner
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Biogärtner
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Ben, il faut créer une association entre la "photo" et le nom du fichier correspondant. Et les dictionnaires sont faits pour çà.
    note: vous pouvez avoir un dictionnaire global qui associe photo à fichier ou créer cette association dans une classe Photo qui aurait pour attribut fichier, images,... Dans votre cas, sans montrez plus de code difficile à dire ce qui serait le plus simple.

    - W
    Bonjour,

    Bon... ça n'a pas été simple. J'ai eu quelques diffficultés à créer mon dictionnaire et surtout à comparer la valeur du bouton à détruire (par exemple : <tkinter.Button object at 0xb5ee780c>) avec les valeurs contenues dans le dictionnaire. Le bouton-photo à détruire ne s'y trouvait jamais. Du coup, j'ai contourné le problème en affectant un numéro à chaque bouton à l'aide d'un tuple : {(1, <tkinter.Button object at 0xb5ee780c>): '/home/benoit/Documents/Python/mon_jardin_2.0/page_accueil.png\n'}.
    Si les numéros sont identiques, la clé et sa valeur sont effacées du dictionnaire. ça fonctionne.

    J'ai eu des difficultés avec le dictionnaire et une de mes listes qu'il a fallu que je transforme en tuple sinon l'itération n'était pas possible. Je n'ai pas bien saisi ce problème. Mais je crois que c'est du au fait que les listes et les dictionnaires sont des containers modifiables alors que les tuples ne le sont pas.

    Il me reste également à régler un autre problème:

    • Je ne peux pas effacer deux boutons-photos à la suite sans sortir de mon programme. Pour pouvoir le faire, Il faut que je ferme le programme après chaque effacement. Je sais pourquoi : le bouton qui commande l'effacement est détruit. (l'erreur "bad window path" apparait dans mon terminal). Je ne sais pas encore comment y remédier mais je cherche.

      EDIT : Problème résolu en appelant la méthode "serre" à la toute fin de la méthode destruction et en rajoutant deux lignes au début de la méthode "serre" (listes vidées de leur contenu respectif) : self.boutons_photos = [ ] et self.chemins = [ ]


    En tout cas, merci pour votre aide. J'apprécie.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    Salut,

    Que dire sinon que vous bataillez avec les "class" et qu'au lieu de vous aider à simplifier votre code, çà tend à rendre les choses plus "compliquées"?
    A la base, une "class" est faite pour fabriquer des objets semblables.

    Dans votre programme, de tels objets sont les photos et les boutons (associés à chaque photo). Et donc si vous voulez des "class", il faut au moins une class Photo et une class Button. Les autres sont à priori inutiles (ou pour faire joli).
    Une fois qu'on a dit çà, il faut préciser rôle et responsabilité de chacune de ces classes: comment les uns dépendent des autres.
    Ce qui revient à raconter une histoire en code.
    On peut partir de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        root = tk.Tk()
        photos = Photo.load('photos_booth.txt')
        for x, photo in enumerate(photos):
            button = Button(photo, root, activebackground='green', cursor='hand2')
            r, c = divmod(x, COLUMNS)
            button.grid(row=r, column=c)
        root.bind('<1>', on_select)
    Cà dit quoi? On lit un tas de photos puis pour chaque photo on crée un Button avec la photo associée et on l'affiche.
    In fine, lorsque l'utilisateur clique sur une photo, c'est "on_select" qui s'en débrouille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def on_select(event):
        button = event.widget
        photo = button.photo
        window = tk.Toplevel(name='selected')
        tk.Label(window, image=photo.image).pack()
     
        def on_delete():
            window.destroy()
            button.delete()
     
        tk.Button(window, text='detruire', command=on_delete).pack()
    Arrivé la dedans, je récupère le button et la photo puis on affiche la chose en grand dans un Toplevel avec un button "detruire".
    note: l'astuce name='selected' permet la destruction du Toplevel et de tout ce qu'il contient si l'utilisateur clique sur une autre photo.
    La class Button ne fait pas grand chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Button(tk.Button):
        def __init__(self, photo, master=None, **kwds):
            super().__init__(master, image=photo.thumbnail, **kwds)
            self.photo = photo
     
        def delete(self):
            self.photo.delete()
            self.destroy()
    Et la class "photo" est plus touffue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class Photo:
        _filename = ''
        _photos = []
     
        def __init__(self, name):
            self.name = name
            photo = self.photo = Image.open(name)
            self.image = ImageTk.PhotoImage(photo)
            photo = photo.copy()
            photo.thumbnail(size=SIZE)
            self.thumbnail = ImageTk.PhotoImage(photo)
     
        @classmethod
        def load(cls, filename):
            cls._filename = filename
            with open(filename) as f:
                   names = f.read().splitlines()
            cls._photos = [ Photo(s) for s in names ]
            return cls._photos[:]
     
        @classmethod
        def save(cls):
            names = [ photo.name for photo in cls._photos ]
            with open(cls._filename, 'w') as f:
                f.write('\n'.join(names))
     
        def delete(self):
            self._photos.remove(self)
            self.save()
    car elle mixe photo individuelle et gestion de la collection (la liste de photos dans le fichier).

    Ci dessous le code en un seul morceau ou j'ai modifié Photo pour ajouter un Menu et la fonctionnalité d'import.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    import os
    import tkinter as tk
    from tkinter import filedialog
    from PIL import Image, ImageTk
    from collections import OrderedDict
     
    ROWS, COLUMNS = 3, 4
    SIZE = 256, 256
    class Photo:
        _filename = ''
        _photos = OrderedDict()
     
        def __init__(self, name):
            self.name = name
            photo = self.photo = Image.open(name)
            self.image = ImageTk.PhotoImage(photo)
            photo = photo.copy()
            photo.thumbnail(size=SIZE)
            self.thumbnail = ImageTk.PhotoImage(photo)
     
     
        @classmethod
        def create(cls, name):
            photo = Photo(name)
            assert name not in cls._photos, 'photo already exists, name=%s' % name
            cls._photos[name] = photo
            return photo
     
        @classmethod
        def load(cls, filename):
            cls._filename = filename
            with open(filename) as f:
                names = f.read().splitlines()
            return [ cls.create(s) for s in names ]
     
     
        @classmethod
        def save(cls):
            names = list(cls._photos.keys())
            with open(cls._filename, 'w') as f:
                f.write('\n'.join(names))
     
        def delete(self):
            del self._photos[self.name]
            self.save()
     
     
    class Button(tk.Button):
        def __init__(self, photo, master=None, **kwds):
            super().__init__(master, image=photo.thumbnail, **kwds)
            self.photo = photo
     
        def delete(self):
            self.photo.delete()
            self.destroy()
     
    def on_select(event):
        button = event.widget
        photo = button.photo
        window = tk.Toplevel(name='selected')
        tk.Label(window, image=photo.image).pack()
     
        def on_delete():
            window.destroy()
            button.delete()
     
        tk.Button(window, text='detruire', command=on_delete).pack()
     
     
    def do_import(master):
        path = filedialog.askopenfilename(title="Importer une image",filetypes=[('png files','.png'),('all files','*.*')])
        if path:
            path = os.path.relpath(path)
            photo = Photo.create(path)
            button = Button(photo, root, cursor='hand2')
            count = len(master.grid_slaves())
            r, c = divmod(count, COLUMNS)
            button.grid(row=r, column=c)
     
    if __name__ == '__main__':
     
        root = tk.Tk()
     
        menubar = tk.Menu(root)
     
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Import", command=lambda: do_import(root))
        filemenu.add_command(label="Exit", command=root.quit)
     
        menubar.add_cascade(label="File", menu=filemenu)
     
        root.config(menu=menubar)
     
        photos = Photo.load('photos_booth.txt')
        for x, photo in enumerate(photos):
            button = Button(photo, root, cursor='hand2')
            r, c = divmod(x, COLUMNS)
            button.grid(row=r, column=c)
        root.bind('<1>', on_select)
        tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti Avatar de Kaa'dem-2072
    Homme Profil pro
    Biogärtner
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Biogärtner
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Que dire sinon que vous bataillez avec les "class" et qu'au lieu de vous aider à simplifier votre code, çà tend à rendre les choses plus "compliquées"?
    A la base, une "class" est faite pour fabriquer des objets semblables.

    Bonjour,

    Merci pour votre code. Il va me falloir un peu de temps pour le décortiquer mais j'ai déjà inclus dans mon code la fonction name='selected', bien pratique en effet.
    Dans votre code, il y a pas mal de choses que je n'ai pas encore saisies, des expressions que je n'avais jamais rencontrées.
    Presque tout ce que j'ai appris jusqu'à aujourd'hui, c'est grâce au livre de Gérard Swinnen "Apprendre à programmer en Python 3" , idéal pour les débutants, et aussi grâce à ce site : http://tkinter.fdex.eu. Mais je me demande s'il existe un autre livre d'un niveau un peu plus exigeant. Si vous pouvez me conseiller...

    Puisqu'il y a un " if __main__ ", je suppose que je peux exécuter votre code dans mon terminal Ubuntu. Malheureusement, je n'ai pas réussi, ni en Python 2 ni en Python 3 (Que ce soit avec "from Tkinter" ou bien avec "from tkinter")
    Voici les erreurs qu'il me retourne :

    Nom : terminal.png
Affichages : 674
Taille : 60,0 Ko

    Je vais continuer à retravailler mon code. Je souhaite y inclure un système de drag and drop avec une corbeille dans mon onglet "Notes", (pour pouvoir jeter les post-it à la poubelle!)
    Voici d'ailleurs à quoi ressemble mon programme : http://www.dailymotion.com/video/x4k1w5n_mon-jardin-2-0_tech

    Bonne journée à vous.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    Salut,

    Citation Envoyé par Kaa'dem-2072 Voir le message
    Puisqu'il y a un " if __main__ ", je suppose que je peux exécuter votre code dans mon terminal Ubuntu. Malheureusement, je n'ai pas réussi, ni en Python 2 ni en Python 3 (Que ce soit avec "from Tkinter" ou bien avec "from tkinter")
    oops, j'avais oublié d'inclure les 2 premières lignes. C'est corrigé.

    Citation Envoyé par Kaa'dem-2072 Voir le message
    Presque tout ce que j'ai appris jusqu'à aujourd'hui, c'est grâce au livre de Gérard Swinnen "Apprendre à programmer en Python 3" , idéal pour les débutants, et aussi grâce à ce site : http://tkinter.fdex.eu. Mais je me demande s'il existe un autre livre d'un niveau un peu plus exigeant. Si vous pouvez me conseiller...
    La documentation Python, les code écrits par d'autres,... sont de bonnes lectures.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/12/2014, 12h38
  2. [Python 2.X] Importer un fichier et coller son contenu dans un fichier .txt
    Par adrbessy dans le forum Tkinter
    Réponses: 1
    Dernier message: 05/08/2014, 21h56
  3. [Batch] Comment vérifier si une ligne de texte existe dans un fichier .txt ?
    Par noder347 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 19/06/2013, 00h54
  4. afficher une photo dont le chemin est dans la base de donné
    Par mvc_dev dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 09/03/2011, 16h44
  5. Scanner Document et garder son chemin dans une table
    Par mcorvaisier dans le forum IHM
    Réponses: 21
    Dernier message: 10/03/2009, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo