Partage
  • Partager sur Facebook
  • Partager sur Twitter

Canvas Tkinter et Reportlab

    23 mai 2011 à 11:15:15

    Bonjour à tous,

    J'ai un petit souci et j'aimerais connaitre votre avis sur la question.

    J'ai une appli graphique avec Tkinter qui génère un schéma. Pour ce faire je crée un canvas et je charge une image sur laquelle je mets du texte avec les coordonnées.

    Mon but est d'exporter ce canvas construit, pour qu'il puisse être utilisé avec reportlab qui est une biblio implémentant son propre canvas.

    En réalité, j'aimerais que le schéma soit généré avant l'exportation en PDF, et qu'il soit présent dans le PDF. L'utilisateur fait ses saisies, il clique sur un bouton "terminer" et là il voit le schéma dans la fenêtre Tk. Ensuite, il clique sur le bouton "exporter en PDF" et là reportlab construit le fichier PDF avec le schéma.

    J'arrive à construire le schéma avec Tk.Canvas() ainsi qu'avec canvas.Canvas() de reportlab mais je préfèrerais ne pas avoir à générer deux fois le même schéma avec deux manières différentes !

    Qu'en pensez-vous ? Avez-vous une solution ? :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 mai 2011 à 22:08:54

      Citation

      Qu'en pensez-vous ?



      Euhhh... comme ça ? Rien :p

      Un petit code ? Parce-que j'aimerais bien voir ton organisation.

      Je ne vois pas trop le problème comme ça, tu détermines un ordre, donc ???

      Ou alors sans code, tu devras donner plus de précisions, voir un algo, à toi de voir.
      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2011 à 9:30:25

        Désolé, ce sera effectivement plus clair avec du code :D

        # -*- coding: UTF-8 -*-
        
        import Tkinter as Tk
        
        from reportlab.platypus import SimpleDocTemplate
        from reportlab.lib.styles import getSampleStyleSheet
        from reportlab.lib.pagesizes import A4
        from reportlab.lib import colors
        from reportlab.pdfgen import canvas
        from reportlab.lib.units import cm
        from reportlab.lib.utils import ImageReader
        
        from PIL import *
        
        class Application :
            def __init__(self):
                self.root = Tk.Tk()
        
                ''' GENERATION DU SCHEMA AVEC UN CANVAS TKINTER '''
                schema = Tk.Canvas()
                schema.pack()
                
                file = Tk.PhotoImage(file = 'test.jpg')
                
                schema.create_image(0, 100, image = file)
                
                schema.create_text(50, 110, text="125")
                schema.create_text(500, 300, text="68.3")
                
                enr = Tk.Button(self.root, text="Exporter en PDF", 
                                            command=self.enregistrer)
                enr.pack()
                
                self.root.mainloop()
        
        
            def enregistrer(self):
                filename = "TEST.pdf"
                
                ''' GENERATION DU MEME SCHEMA AVEC UN CANVAS REPORTLAB
                pdf = canvas.Canvas(filename, pagesize=A4)
                
                pdf.drawImage(ImageReader('test.jpg'), 0, 100, 680, 300)
                
                pdf.setFont('Helvetica', 14)
                pdf.setFillColor(colors.red)
                
                pdf.drawString(50, 110, "125")
                pdf.drawString(500, 300, "68.3")
                
                pdf.showPage()
                
                pdf.save()
            
        Application()
        


        Donc je construis et j'affiche le schéma dans la fenêtre, pour ensuite reconstruire le même schéma avec les méthodes de reportlab, et je crée le pdf.

        Dans l'idéal j'aimerais trouver un moyen de ne générer le schéma qu'une fois.

        Tant que j'y suis, j'aurai une autre question ! C'est une petite question :p Est-ce possible d'ouvrir le fichier PDF que je génère avec reportlab ? Parce qu'il se sauvegarde bien dans le répertoire mais j'aurais aimé qu'il se lance juste après (sinon ça sert à rien de le générer :D ). En réalité, il suffit de lancer un fichier avec l'application windows par défaut. Cela dit, je ne vois pas comment faire ça :euh:

        Merci ! :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 mai 2011 à 11:38:27

          Eh bien simplement tu mets le fichier hors de ta classe et de tes fonctions

          # -*- coding: UTF-8 -*-
          
          import Tkinter as Tk
          
          from reportlab.platypus import SimpleDocTemplate
          from reportlab.lib.styles import getSampleStyleSheet
          from reportlab.lib.pagesizes import A4
          from reportlab.lib import colors
          from reportlab.pdfgen import canvas
          from reportlab.lib.units import cm
          from reportlab.lib.utils import ImageReader
          
          from PIL import *
          
          monfichier = 'test.jpg'
          
          class Application :
              def __init__(self):
                  self.root = Tk.Tk()
          
                  ''' GENERATION DU SCHEMA AVEC UN CANVAS TKINTER '''
                  schema = Tk.Canvas()
                  schema.pack()
                  
                  file = Tk.PhotoImage(file = monfichier) # ne pas utiliser le mot réservé file comme variable
                  
                  schema.create_image(0, 100, image = file)
                  
                  schema.create_text(50, 110, text="125")
                  schema.create_text(500, 300, text="68.3")
                  
                  enr = Tk.Button(self.root, text="Exporter en PDF", 
                                              command=self.enregistrer)
                  enr.pack()
                  
                  self.root.mainloop()
          
          
              def enregistrer(self):
                  filename = 'TEST.pdf'
                  
                  ''' GENERATION DU MEME SCHEMA AVEC UN CANVAS REPORTLAB'''
                  pdf = canvas.Canvas(filename, pagesize=A4)
                  
                  pdf.drawImage(ImageReader(monfichier), 0, 100, 680, 300)
                  
                  pdf.setFont('Helvetica', 14)
                  pdf.setFillColor(colors.red)
                  
                  pdf.drawString(50, 110, "125")
                  pdf.drawString(500, 300, "68.3")
                  
                  pdf.showPage()
                  
                  pdf.save()
              
          Application()
          


          Si j'ai bien compris car c'est toujours aussi dur de comprendre où tu veux réellement en venir.

          Edit :

          Citation

          Tant que j'y suis, j'aurai une autre question ! C'est une petite question :p Est-ce possible d'ouvrir le fichier PDF que je génère avec reportlab ? Parce qu'il se sauvegarde bien dans le répertoire mais j'aurais aimé qu'il se lance juste après (sinon ça sert à rien de le générer :D ). En réalité, il suffit de lancer un fichier avec l'application windows par défaut.



          regarde du côté de pageCatcher, mais je ne suis pas sûr que se soit libre.
          • Partager sur Facebook
          • Partager sur Twitter
            24 mai 2011 à 12:25:34

            Citation : fred1599

            Eh bien simplement tu mets le fichier hors de ta classe et de tes fonctions

            # -*- coding: UTF-8 -*-
            
            import Tkinter as Tk
            
            from reportlab.platypus import SimpleDocTemplate
            from reportlab.lib.styles import getSampleStyleSheet
            from reportlab.lib.pagesizes import A4
            from reportlab.lib import colors
            from reportlab.pdfgen import canvas
            from reportlab.lib.units import cm
            from reportlab.lib.utils import ImageReader
            
            from PIL import *
            
            monfichier = 'test.jpg'
            
            class Application :
                def __init__(self):
                    self.root = Tk.Tk()
            
                    ''' GENERATION DU SCHEMA AVEC UN CANVAS TKINTER '''
                    schema = Tk.Canvas()
                    schema.pack()
                    
                    file = Tk.PhotoImage(file = monfichier) # ne pas utiliser le mot réservé file comme variable
                    
                    schema.create_image(0, 100, image = file)
                    
                    schema.create_text(50, 110, text="125")
                    schema.create_text(500, 300, text="68.3")
                    
                    enr = Tk.Button(self.root, text="Exporter en PDF", 
                                                command=self.enregistrer)
                    enr.pack()
                    
                    self.root.mainloop()
            
            
                def enregistrer(self):
                    filename = 'TEST.pdf'
                    
                    ''' GENERATION DU MEME SCHEMA AVEC UN CANVAS REPORTLAB'''
                    pdf = canvas.Canvas(filename, pagesize=A4)
                    
                    pdf.drawImage(ImageReader(monfichier), 0, 100, 680, 300)
                    
                    pdf.setFont('Helvetica', 14)
                    pdf.setFillColor(colors.red)
                    
                    pdf.drawString(50, 110, "125")
                    pdf.drawString(500, 300, "68.3")
                    
                    pdf.showPage()
                    
                    pdf.save()
                
            Application()
            



            Si j'ai bien compris car c'est toujours aussi dur de comprendre où tu veux réellement en venir.



            En réalité l'image (filename) est affichée et ensuite je mets des valeurs dessus avec les coordonnées. C'est ça que j'appelle le schéma : image + valeurs.

            Avec Tkinter, je peux afficher l'image avec un canvas, et ensuite appeler la méthode create_text() pour y mettre mes valeurs (cf code du constructeur). Ensuite, je veux exporter le schéma en PDF donc j'utilise la biblio reportlab pour générer le PDF. Sauf que reportlab a son propre canvas et ses propres méthodes. Donc je ne sais pas si je peux directement insérer le canvas Tkinter dans le canvas reportlab ou si je dois regénérer le schéma avec reportlab (cf code méthode enregistrer).

            Parce que dans mon code actuelle je dois afficher l'image deux fois (ça on s'en fout) mais je dois aussi placer les valeurs deux fois ! Et dans mon exemple il n'y a que deux valeurs à mettre sur l'image mais en fait j'en ai une bonne vingtaine. Donc il faudrait que je gère les coordonnées de chaque valeur sur l'image dans le constructeur (pour que le schéma légendé soit affiché) mais aussi que je recommence sur l'image dans la méthode enregistrer avec les méthodes de reportlab (pour qu'il soit dans le PDF).

            Ca va être fastidieux, il va falloir que je m'assure du bon placement des valeurs dans le constructeur et la méthode enregistrer.

            Je voudrais juste savoir s'il existe une alternative. Par exemple, si je peux appeler la méthode enregistrer comme ceci :

            def enregistrer(self, schema):
            


            Et ensuite, si je peux l'intégrer dans le pdf avec reportlab ce serait un peu plus optimisé. Pour l'instant, je ne connais que des méthodes reportlab permettant de créer des formes, insérer du texte ou afficher une image, rien pour inclure un canvas (Tk.Canvas). Et inversement, le schéma généré avec reportlab ne peux pas être affiché dans la fenêtre (je crois), il ne sert qu'à la construction du PDF.

            Suis-je plus clair ? :)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 mai 2011 à 13:59:51

              Pour faire simple je dirais, plusieurs images c'est plusieurs objets qui sont sous la même forme.

              Le plus simple pour toi serait de créer une classe Image avec comme arguments, le nom du fichier et les coordonnées.

              • Partager sur Facebook
              • Partager sur Twitter
                24 mai 2011 à 14:17:49

                Oui ce serait mieux, mais mon problème reste entier. Dans cette classe je construierai le schéma à partir d'une image et de textes insérés sous la forme d'un canvas (Tk.Canvas). Sauf que reportlab si je lui donne un canvas Tkinter, il ne peut rien en faire :(
                • Partager sur Facebook
                • Partager sur Twitter

                Canvas Tkinter et Reportlab

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown