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

Tkinter Python Discussion :

comment imprimer le contenu d'un canevas?


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut comment imprimer le contenu d'un canevas?
    bjr,

    je voudrais imprimer le contenu d'un canevas,est-ce possible?
    Est-il possible également d'éditer le contenu d'un canevas sous word?

    merci d'avance pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    en fait mon idée de base n'est pas la bonne
    donc je reformule ma question,
    Est-il plutot possible d'inserer un canevas dans un widget text pour que je puisse
    imprimer le contenu du text car le canevas contient des boutons placés par coordonnées?

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Je ne vois pas l'intérêt de mettre un Canvas dans un widget Text.
    A ma connaissance Tkinter ne permet pas l'impression (il existe peut être un module additionnel).
    Si tu veux imprimer du texte, il faut d'abord le récurer avec la méthode get() de la classe Text.
    Ensuite tu as plusieurs solutions:
    Si tu es sur windows tu as le module win32print.
    Tu peux aussi utiliser le module HtmlEasyPrinting de wxpython. Je n'ai jamais essayé mais ça à l'air très simple d'utilisation.
    Tu as aussi le module QPrinter de pyqt.

    Il y a certainement beaucoup d'autre solutions. voici quelques liens:
    http://timgolden.me.uk/python/win32_how_do_i/print.html
    http://wiki.wxpython.org/Printing
    http://qt.developpez.com/doc/4.3/printing/

  4. #4
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    C'est un sujet déjà évoqué. On peut créer un fichier postscript depuis un canvas.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    Merci pour toutes ces précisions,je suis allé jeter un oeil à toutes ces ressources sans trouver de réponse qui me convienne.
    Je vais essayer d'expliquer ce que je recherche:
    -J'ai des canevas qui contiennent des images,sur ces images(dans le canevas)
    j'ajoute des boutons qui sont placés en fonction de coordonnés recuperées dans une database.
    un click sur un bouton(numéroté)affiche des informations dans un topleve().

    -je voudrais imprimer un rapport qui contient chaque images avec les boutons
    avec sous chaque images les infos récupérées dans la db sous forme de texte ou widget label,ce qui bloque c'est surtout le fait de vouloir imprimer un widget canvas qui contient d'autre widget.
    merci pour votre aide car je suis completement bloqué.

  6. #6
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Dans ce cas, tu devrais créer une image contenant ton canvas et tous les widgets.
    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
    from PIL import ImageTk,ImageGrab
    from Tkinter import *
     
    def save_image():
        x = can.winfo_rootx()
        y = can.winfo_rooty()
        w = can.winfo_width()
        h = can.winfo_height()
        image=ImageGrab.grab((x+2, y+2, x+w-2, y+h-2))
        image.save("tmp.bmp")
     
    root=Tk()
    can=Canvas(root,width=100,height=100)
    can.pack()
    mon_image=ImageTk.PhotoImage(file='test.jpg')
    can.create_image(100,100,image=mon_image)
    b=Button(can,text="bouton",command=save_image)
    can.create_window((50,50),window=b)
     
    root.mainloop()

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    Merci c'est exactement ce que je cherchais comme solution je vais tester ça.
    Je me suis plongé dans la doc de reportlab,cela me parait un peu compliqué au vu de mon niveau,donc ta solution me parait très adaptée.merci encore.
    slts

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    Ta solution est super.
    Il a t-il maintenant un moyen d'ouvrir un document vierge ms word et d'y inserer les images crées ce script?
    Je voudrais éviter de passer par du pdf.

  9. #9
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Il a t-il maintenant un moyen d'ouvrir un document vierge ms word et d'y inserer les images crées ce script?
    Pour cela, il faut utiliser pywin32.
    Je voudrais éviter de passer par du pdf.
    Tout dépend de ce que tu veux faire.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    avant de generer une image en utilisant le code ci-dessus,j'essaie d'afficher des canvas à la suite dans un canvas avec scrolling comme expliqué dans une autre discussion .ceci pour effectuer un preview du rapport que je cherche à imprimer.
    les images contenues dans les canvas sont celles inclusent dans la liste_vues
    je recupere également des données d'une base de donnée pydblite.
    le pb est que les images ne s'affichent pas
    ci dessous le code (j'espere avoir mis les bonnes balises pour qu'il s'affiche bien,désolé si ce n'est pas le cas).

    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
    # -*- coding: cp1252 -*-
    from Tkinter import *
    from PyDbLite import Base
     
    class Report:
        "mise en place du rapport"
        def __init__(self,liste_vues,reg):
            self.reg=reg
            self.liste_vues=liste_vues
     
            db=Base(self.reg)
            db.open()
     
            db1=Base('acr_reg')
            db1.open()
            t=[r['type'] for r in db1 if r['reg']==self.reg]
            self.acr_type=t[0]
     
            fen=Toplevel()
     
            vsb = Scrollbar(fen, orient=VERTICAL)
            vsb.grid(row=0, column=1, sticky=N+S)
            self.c = Canvas(fen,yscrollcommand=vsb.set)
            self.c.grid(row=0, column=0, sticky="news")
            vsb.config(command=self.c.yview)
            fen.grid_rowconfigure(0, weight=1)
            fen.grid_columnconfigure(0, weight=1)
            self.c1=Frame(self.c)
            taille=len(self.liste_vues)
            r=0
     
     
            if taille>0:
                while r<taille:
                    self.r1=self.liste_vues[r]
                    self.liste_vues[r]=Image(self)
                    r=r+1
     
            self.c.create_window(750,1000,window=self.c1)
            self.c.config(scrollregion=self.c.bbox("all"))
     
    fen.mainloop()
     
    class Image:
        def __init__(self,main):
     
            self.main=main
            canevas=Canvas(self.main.c1,width=700,height=500,bg='red')
            mon_image=PhotoImage(file='mon.image')
            canevas.create_image(100,100,image=mon_image)
            canevas.pack()
            canevas.update_idletasks()

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    c'est bon,j'avais simplement oublié quelques self.
    Par contre j'essaie de trouver de la doc sur pywin32,Existe-t'il un tuto sur le sujet?
    Comment créer un doc word et y placer des images?
    cette manip permettrai à l'utilisateur de gerer ses entêtes et l'impression.

  12. #12
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    Tu peux aussi utiliser générer du rtf avec PyRTF. C'est une version beta, mais je n'ai jamais eu de problème avec.

    ex dans ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        def vuesToRTF(self):
            doc = PyRTF.Document()
            section = PyRTF.Section()
            doc.Sections.append(section)
            for vue in self.liste_vues:
                img = PyRTF.Image( vue )
                section.append(PyRTF.Paragraph(img))
            renderer = PyRTF.Renderer()
            fichier=open("test.rtf","w")
            renderer.Write(doc, fichier)

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    mon pb est que j'ai des boutons qui s'affichent à des coordonées extraitent
    d'une db dans les canevas sur les images.
    je voudrait récuperer le contenu du canevas complet avec les boutons qui sont numérotés car dans l'inteface,un click sur un bouton affiche des infos.
    suite à tes infos données dans un autre tuto(mes pb avec PIL pour recuperer
    la "photo" du canevas)je me suis orienté vers la solution grab de PIL.
    Je voudrais éviter d'avoir à generer un pdf via reportlab en redessinant tout les boutons numérotés mais simplement utiliser reportlab pour afficher ces "photos" avec dessous un tableau avec les infos.Cette solution me parait
    plus à ma portée.
    Peut-être as tu une idée qui pourrait me simplifier la tache?
    Merci pour ton investissement!

  14. #14
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Si je résume :
    Tu as un Canvas dans lequel tu places d'autres Canvas avec des images et des boutons, afin de les imprimer.
    Tu veux utiliser reportLab pour afficher les "photos" de tes Canvas avec en dessous un tableau contenant des infos...

    Par contre j'obtient une impression du bas de mon écran,comment peut on limiter au contenu seul du canevas?
    Grab fait une copie d'écran. Il faut donc que ce que tu souhaites copier soit visible.
    Est-ce que tu ne pourrais pas utiliser PIL pour dessiner tes boutons sur tes images ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Par défaut
    Je vais regarder de ce coté la,c'est une bonne piste.
    merci

Discussions similaires

  1. Comment Imprimer le contenu d'une DataGridView?
    Par Abdelkabir dans le forum VB.NET
    Réponses: 2
    Dernier message: 08/03/2007, 18h06
  2. Comment imprimer le contenu de mon container
    Par JavaChouke dans le forum Langage
    Réponses: 1
    Dernier message: 22/11/2006, 12h36
  3. [c#] Comment imprimer le contenu dune listbox dans un fichier
    Par Clarissa2006 dans le forum Windows Forms
    Réponses: 14
    Dernier message: 24/06/2006, 18h21
  4. [Delphi 6] Comment imprimer le contenu d'un TStringGrid ?
    Par bobstar dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/09/2005, 18h43
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

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