Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retailler une image embarquée dans le widget Text

Sujet résolu
    1 avril 2022 à 18:51:27

    Bonjour

    J'ai fini par en tomber d'accord avec ceux qui m'ont dit que les pages HTML écrites par Word, c'était pas terrible ! En fait, c'est horrible. Alors je me fais un petit outil pour saisir mes textes et les convertir en HTML. J'insère l'image en la choisissant avec Listbox, en la faisant arriver divisée par 4. Après, j'ajuste encore sa taille avec un Scale. Ça marche à peu près, mais il y a quand-même un os. Je suis obligé de mettre le programme en arrêt avec des input, sinon l'image s'en va. (j'ai mis du temps à avoir l'idée d'un input, tout allait comme si l'image n'avait jamais été embarquée. Vous voyez dans mon code deux lignes input("-----") sans lesquelles ça ne marche pas. Mais bien sûr, c'est pas comme ça qu'il faut faire.

    	def insertionImage(self):
    
    		def reduire(event):
    			reduc = self.reg.get()
    			facteur = 1 / reduc * 2
    			l, h  = int(self.larg / facteur), int(self.haut / facteur)
    			i = ImageTk.PhotoImage(self.im.resize([l, h]))
    			self.text.delete(self.la)
    			self.text.image_create(self.la, image =i)
    			b=input(" --- ")		
    
    		def choisir(event) :
    			def pointe(event, i = 'current'):
    				self.la = self.text.index(i)
    
    			posit =  self.images.curselection()
    			self.nom_fichier = self.images.get(posit[0])
    			self.chemin_nom = 'static/img/' + self.nom_fichier
    			self.im = Image.open(self.chemin_nom)
    			self.larg, self.haut = self.im.width, self.im.height 
    			self.im_ = self.im.resize([self.larg//2, self.haut//2])
    			z = ImageTk.PhotoImage(image = self.im_)
    			ascenseur.grid_remove()
    			self.images.grid_remove()
    			self.la = "1.0"
    			if self.insertion_texte :
    				a = label(text = """Clique\n
    					sur le texte\n où tu insères\n
    					l'image.\n(Entre deux lignes)""")
    				a.grid(row = 2, column = 10)
    				self.text.bind("<Button-1>", pointe)
    				a.grid_remove()
    
    			self.text.image_create(self.la, image =z)
    			b=input(" --- ")
    
    		noms = listdir('static/img')
    		ascenseur = Scrollbar(self, orient='vertical')
    		self.images = Listbox(self, selectmode='single', 
    							height = 20, yscrollcommand=ascenseur.set)
    		self.images.grid(row=2, column=10, sticky='nsew')
    		ascenseur.grid()
    		self.images.bind("<Return>", choisir)#FocusIn
    		ascenseur['command'] = self.images.yview
    		for n in noms :
    			self.images.insert('end', n)
    
    		self.reg = Scale(self, length = 150, orient = HORIZONTAL, 
    							resolution = 0.05, tickinterval = 0.2, 
    							sliderlength = 10, width = 10, 
    							from_ = 0.1, to = 1, command = reduire)
    		self.reg.grid(row = 1, column = 10)
    
    	
    

    Quand je tape entrée à la fin de choisir(), ou quand je modifie la taiille de l'image avec le Scale, j'ai ce message :

    RuntimeError: can't re-enter readline

    • Partager sur Facebook
    • Partager sur Twitter

    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

      4 avril 2022 à 12:39:04

      comme à la fin de choisir tu attend un input, et que tu as associé la touche Entrée à la fonction choisir(), je pense que quand tu tapes Entrée, ça exécute choisir() et ça redemande un input alors qu'il déjà en attente d'un input, d'où le message d'erreur.

      je pense que si tu remplaces tes variables i et z par des self.i et self.z, tu n'aurai plus besoin de tes input

      • Partager sur Facebook
      • Partager sur Twitter
        4 avril 2022 à 16:20:19

        Merci umfred. j'avais déjà "selfisé" z dans choisir (elle s'appelle self.photo à présent). Mais la photo en cours de réduction, non. Et je comprends l'importance de ce détail ! Pour demeurer elle ne peut pas être locale. j'ai donc fait ça, et je peux à présent supprimer ces input. Et ça marche aussi bien. Le problème est réglé en ce qui concerne la photo en réduction. 

        Mais j'ai toujours un autre problème, non évoqué dans mon premier post  : quand j'insère une autre image, la première disparaît, il ne reste que son format, une espèce de caractère géant aux dimensions de l'image, mais blanc. Si j'ai bonne mémoire, le symptôme que j'avais au cours de la réduction était identique : l'image disparaissait mais son format restait.

        Je crois que j'ai compris ce qui me reste à faire : il faut conserver chaque objet, donc instancier chaque photo, et non pas, comme je le fais toujours instancier le même objet.

        Y a plus qu'à réfléchir à la façon de s'y prendre !

        Voici la dernière version de mon code :

        def validerPhoto(self, event) :
        		self.photo_inserees[self.nom_fichier] = [self.larg, self.haut]
        		print(self.photo_inserees)
        		self.lab2.unbind("<Button-1>")
        		self.lab2.grid_remove()
        		self.text.unbind("<Button-1>")
        		self.reg.grid_remove()
        
        	def situer(self, event):
        		print("situer")
        		self.liste.unbind("<Button-1>")
        		self.la = self.text.index('current')
        		print("index = " + self.la)
        		if self.clic == "insertion_image" :
        			self.lab1.grid_remove()
        			self.text.image_create(self.la, image = self.photo)	
        		elif self.clic == "clic_sur_image" :
        			self.reduire
        		self.lab2 = Label(self, text = "valider\nla photo\n et sa taille")
        		self.lab2.grid(row = 2, column = 10)
        		self.lab2.bind("<Button-1>", self.validerPhoto)
        
        	def insertionImage(self):			
        		def choisir(event) :
        			self.liste.unbind("<Return>")
        			print("choisir image")
        			posit =  self.liste.curselection()
        			self.nom_fichier = self.liste.get(posit[0])
        			self.chemin_nom = 'static/img/' + self.nom_fichier
        			self.im = Image.open(self.chemin_nom)
        			self.larg, self.haut = self.im.width//2, self.im.height//2 
        			self.im_quart = self.im.resize([self.larg, self.haut])
        			self.photo = ImageTk.PhotoImage(image = self.im_quart)
        			self.ascenseur.grid_remove()
        			self.liste.grid_remove()
        			self.la = "1.0"
        			if self.insertion_texte :
        				self.lab1 = Label(self, text = "clique\nsur le texte\n où tu insères\nl'image.\n(Entre deux lignes)")
        				self.lab1.grid(row = 2, column = 10)
        				self.clic = "insertion_image"
        				self.text.bind("<Button-1>", self.situer)
        				
        			else :
        				self.text.image_create(self.la, image = self.photo)
        				self.lab2 = Label(self, text = "valider\nla photo\n et sa taille")
        				self.lab2.grid(row = 2, column = 10)
        				self.lab2.bind("<Button-1>", self.validerPhoto)
        
        		self.boiteListe("img")
        		self.liste.bind("<Return>", choisir)
        
        		for n in self.noms :
        			self.liste.insert('end', n)
        
        		self.reg = Scale(self, length = 150, orient = HORIZONTAL, resolution = 0.05, tickinterval = 0.2, 
        							sliderlength = 10, width = 10, from_ = 1, to = 0.1)
        		self.reg.set(1)
        		self.reg.configure(command = self.reduire)
        		self.reg.grid(row = 1, column = 10)
        		
        
        	def reduire(self, event):
        		reduc = self.reg.get()
        		facteur = 1 / reduc
        		l, h  = int(self.larg / facteur), int(self.haut / facteur)
        		self.i = ImageTk.PhotoImage(self.im.resize([l, h]))
        		self.text.delete(self.la)
        		self.text.image_create(self.la, image = self.i)
        



        • Partager sur Facebook
        • Partager sur Twitter

        S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

        Retailler une image embarquée dans le widget Text

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown