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 :

Enregistrer une image d'un canvas


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut Enregistrer une image d'un canvas
    Bonjour,

    J'ai réalisé un dessin dans un canvas en Python, et j'aimerais maintenant l'enregistrer comme une image "classique" (format png par exemple). Quelqu'un saurait-il comment il faut s'y prendre ?

    En vous remerciant pour votre attention,

    Agent322.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    J'ai réalisé un dessin dans un canvas en Python, et j'aimerais maintenant l'enregistrer comme une image "classique" (format png par exemple). Quelqu'un saurait-il comment il faut s'y prendre ?
    On peut utiliser ImageGrab.grab de PIL pour sauvegarder une copie de la fenêtre comme montré dans cette discussion (ancienne mais toujours d'actualité).

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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Bonsoir wiztricks,

    Merci pour cette réponse. J'ai tapé le code suivant :


    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
    from PIL import ImageGrab
    from tkinter import *
     
    def Dessiner() :
        F = Tk()
        C = Canvas(F, width = 500, height = 500, bg = 'blue')
        C.pack()
     
        x = Canvas.winfo_rootx(C)
        y = Canvas.winfo_rooty(C)
        w = Canvas.winfo_width(C)
        h = Canvas.winfo_height(C)
     
        img= ImageGrab.grab((x, y, x+w, y+h)).save("IMAGE.png")
     
     
        F.mainloop

    Je n'ai pas mis "x+2", "y+2", "x+w-2", et "y+h-2" comme dans le code de la discussion à laquelle vous m'avez renvoyée, car j'ai un message d'erreur dans ce cas.
    Je pense pouvoir expliquer ce message d'erreur par ceci : les méthodes winfo_width et winfo_height de Canvas renvoient ici 1, ce qui donne, pour "x+w-2" par exemple, 0+1-2 = -1 . C'est donc la fonction grab qui produit l'erreur. La question est : pourquoi winfo_width et winfo_height renvoient 1 et pas 500 ?

    Par ailleurs, est-il possible de choisir l'emplacement du fichier ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Agent322 Voir le message
    La question est : pourquoi winfo_width et winfo_height renvoient 1 et pas 500 ?
    Tant que le Canvas n'est pas affiché (via .pack par exemple), ses dimensions sont inconnues.
    Mais le code que vous postez n'est que la définition d'une fonction: çà ne fait rien. Donc difficile de voir dans quel piège vous êtes tombé.

    Citation Envoyé par Agent322 Voir le message
    Par ailleurs, est-il possible de choisir l'emplacement du fichier ?
    En écrivant .save("IMAGE.png") çà le sauvegarde dans le répertoire courant, pour exprimer "ailleurs", il suffit de prefixer le nom du fichier par celui du répertoire.

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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Mais j'ai bien affiché le canvas avec pack avant d'utiliser winfo_width et winfo_height.

    Je suis désolé mais ne comprends ce que je peux fournir de plus que le code de la fonction Dessiner. C'est tout ce qu'il y a d'écrit dans l'éditeur, et quand j'écris Dessiner() dans la console, il m'affiche simplement une fenêtre avec un carré bleu.

    Merci pour la deuxième réponse, j'ai réussi à enregistrer l'image (du moins le pixel), là où je voulais.

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Salut,

    Pour des raisons de performances les frameworks graphiques ne rafraîchissent la fenêtre et/ou ses contenus qu'une fois finis le code en cours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        img= ImageGrab.grab((x, y, x+w, y+h)).save("IMAGE.png")
     
     
        F.mainloop
    la fenêtre sera affichée après F.mainloop() donc ImageGrab.grab() se fait dans l'inconnu.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Agent322 Voir le message
    Je suis désolé mais ne comprends ce que je peux fournir de plus que le code de la fonction Dessiner. C'est tout ce qu'il y a d'écrit dans l'éditeur, et quand j'écris Dessiner() dans la console, il m'affiche simplement une fenêtre avec un carré bleu.
    Si vous postez du code pour reproduire un problème, on va le recopier dans un fichier (exemple: script.py) puis on va taper python3 script.py dans un terminal quelconque pour voir ce que çà fait.
    Un éditeur est juste un outil de mise au point d'un programme/script.... qui doit pouvoir fonctionner sans (et seulement avec l'interpréteur Python et les éventuelles bibliothèques externes - comme PIL -)

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

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse VinsS. Cependant, même en ayant écrit le code comme ci dessous, j'obtiens le même résultat.

    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
    from PIL import ImageGrab
    from tkinter import *
     
    def Dessiner() :
        F = Tk()
        C = Canvas(F, width = 500, height = 500, bg = 'blue')
        C.pack()
     
        F.mainloop
     
        x = Canvas.winfo_rootx(C)
        y = Canvas.winfo_rooty(C)
        w = Canvas.winfo_width(C) 
        h = Canvas.winfo_height(C)
     
        img= ImageGrab.grab((x, y, x+w, y+h)).save("G:\MP 5-2\TIPE\IMAGE.png")

    wiztricks, je n'ai pas bien compris ce que vous avez dit, mais, au risque de paraître pragmatique : qu'est qui vous serez utile que je poste pour comprendre le problème avec winfo_width et winfo_height ?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Agent322 Voir le message
    wiztricks, je n'ai pas bien compris ce que vous avez dit, mais, au risque de paraître pragmatique : qu'est qui vous serez utile que je poste pour comprendre le problème avec winfo_width et winfo_height ?
    Créez un script, sortez de l'éditeur, lancez un terminal et essayez de reproduire le problème.
    Si vous y arrivez vous aurez un script à poster.
    Pour l'instant, la seule chose que je peux vous montrer, c'est sous l’interpréteur Python interactif (lancé depuis un terminal et non depuis un IDE):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> from PIL import ImageGrab
    >>> from tkinter import *
    >>> w = Canvas(width = 500, height = 500)
    >>> w.winfo_width()
    1
    >>> w.pack()
    >>> w.winfo_width()
    504
    >>>
    et vous voyez qu'après le .pack(), .winfo_width() ne retourne plus "1" (même si ce n'est pas toujours le cas suivant le contexte).

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

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Navré, mais je ne comprends toujours pas ce que vous dîtes. Comment faire un "script" ? Qu'est ce que ça veut dire "lancer un terminal", et "reproduire le problème" ?

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Agent322 Voir le message
    Navré, mais je ne comprends toujours pas ce que vous dîtes. Comment faire un "script" ? Qu'est ce que ça veut dire "lancer un terminal", et "reproduire le problème" ?
    Pour moi, c'est dans les premiers chapitres de tous les bons tutos. et les tutos. permettent aussi de définir un vocabulaire commun qui permet de se comprendre lorsqu'on demande de l'aide dans un forum.
    note: et ce sont aussi des règles applicables avant de poster.

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

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Si j'ai bien compris ce que j'ai lu, j'ai ouvert python.exe pour ouvrir "le terminal" et j'ai écrit les lignes de mon code successivement jusqu'à ce que l'erreur apparaisse. En l'occurrence, l'erreur n'est plus la même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> from tkinter import *
    >>> F = Tk()
    >>> C = Canvas(F, width = 500, height = 500, bg = 'blue')
    >>> C.pack()
    >>> F.mainloop()
    >>> C.winfo_width()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\Thevi\Miniconda3\lib\tkinter\__init__.py", line 1158, in winfo_width
        self.tk.call('winfo', 'width', self._w))
    _tkinter.TclError: can't invoke "winfo" command: application has been destroyed

  13. #13
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    Y'a un truc que j'ai pas saisi, tout du moins, cela ne me semble pas très clair, pourquoi ne pas directement récupérer la largeur via son dictionnaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C = Canvas(F, width = 500, height = 500, bg = 'blue')
    print(C['width'])
    Ou encore avec (mais plus lourd) :
    Qui ne nécessite pas d'avoir utilisé pack ou autres au préalable.
    Le temps ronge l'amour comme l'acide.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Agent322 Voir le message
    Si j'ai bien compris ce que j'ai lu, j'ai ouvert python.exe pour ouvrir "le terminal" et j'ai écrit les lignes de mon code successivement jusqu'à ce que l'erreur apparaisse. En l'occurrence, l'erreur n'est plus la même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> from tkinter import *
    >>> F = Tk()
    >>> C = Canvas(F, width = 500, height = 500, bg = 'blue')
    >>> C.pack()
    >>> F.mainloop()
    >>> C.winfo_width()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\Thevi\Miniconda3\lib\tkinter\__init__.py", line 1158, in winfo_width
        self.tk.call('winfo', 'width', self._w))
    _tkinter.TclError: can't invoke "winfo" command: application has been destroyed
    Pour pouvoir exécuter l'instruction C.winfo_width(), il vous a fallu sortir de F.mainloop() en cliquant sur la "croix" en haut à droite de la fenêtre. Ce qui termine l'application (et explique le message d'erreur). Relisez votre code, ou celui que je vous ai donné, l'ordre des instructions est important.

    Citation Envoyé par Agent322 Voir le message
    j'ai écrit les lignes de mon code successivement jusqu'à ce que l'erreur apparaisse. En l'occurrence, l'erreur n'est plus la même :
    Il n'y a pas d'erreur, juste des conséquences normales aux instructions que vous donnez à la machine (même si vous ne savez pas trop ce que vous lui demandez).

    Citation Envoyé par bistouille Voir le message
    Y'a un truc que j'ai pas saisi, tout du moins, cela ne me semble pas très clair, pourquoi ne pas directement récupérer la largeur via son dictionnaire ?
    Parce ce qu'on essaie de faire une copie d'écran et donc on part des dimensions réelles de la fenêtre (qui ne sont pas toujours celles qu'on demande mais celles calculées par le geometry manager choisi en fonction de tas de paramètres).

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

  15. #15
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Ah, ok, j'étais resté focalisé sur ce problème en ayant oublié la demande initiale.

    Par contre je viens de regarder si côté tcl y'avait pas des scripts destiné à cet usage que l'on pourrait exécuter dans tkinter, j'en ai trouvé, mais je n'ai pas réussi à en faire fonctionner un avec tcl8.6, problème de package et autres joyeusetés, et comme la syntaxe de tcl est comment dire ... beurk, j'ai laissé tomber
    Le temps ronge l'amour comme l'acide.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Par contre je viens de regarder si côté tcl y'avait pas des scripts destiné à cet usage que l'on pourrait exécuter dans tkinter, j'en ai trouvé, mais je n'ai pas réussi à en faire fonctionner un avec tcl8.6, problème de package et autres joyeusetés, et comme la syntaxe de tcl est comment dire ... beurk, j'ai laissé tomber
    Yup, TCL est un cousin éloigné de Python.
    Ceci dit, .winfo_width fonctionne raisonnablement puisqu'on est bien obligé d'afficher la portion d'écran à copier.
    Le soucis est d'arriver à faire raconter au PO comment il se débrouille pour que çà ne fonctionne pas...
    Pas facile à inventer, donc c'est pas gagné.

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

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Sans afficher le canvas, cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> from tkinter import *
    >>> F = Tk()
    >>> C = Canvas(F, width = 500, height = 500)
    >>> C.winfo_width()
    1

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Pardon, j'ai oublié l'instruction "pack" . Mais le problème semble persister :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from tkinter import *
    >>> F = Tk()
    >>> C = Canvas (F, width = 500, height = 500)
    >>> C.pack()
    >>> C.winfo_width()
    1

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Agent322 Voir le message
    Pardon, j'ai oublié l'instruction "pack" . Mais le problème semble persister :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from tkinter import *
    >>> F = Tk()
    >>> C = Canvas (F, width = 500, height = 500)
    >>> C.pack()
    >>> C.winfo_width()
    1
    Et bien maintenant qu'on a la recette de cuisine pour reproduire quelque chose, on peut constater que ce n'est pas vrai partout et donc il faudra préciser l'environnement système, la version de Python et comment vous avez lancé la console (la chose qui affiche/prompte ">>>") (éventuellement après avoir vérifié que l'ajout de C.update() avant C.winfo_width() ne changeait rien non plus - mais ce n'est pas une solution).

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

  20. #20
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ceci dit, .winfo_width fonctionne raisonnablement puisqu'on est bien obligé d'afficher la portion d'écran à copier.
    Le soucis est d'arriver à faire raconter au PO comment il se débrouille pour que çà ne fonctionne pas...
    Pas facile à inventer, donc c'est pas gagné.

    - W
    Dommage, je peux même pas tester car ImageGrab est incompatible avec linux, solution via scrot :

    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
    import tkinter as tk
    import subprocess
     
    def capturerFenetre(evt=None) :
        try :
            if subprocess.call(['scrot', '-u', '-b', '-z', 'test_capture.png']) :
                texte = 'Échec de la capture d\'écran ...'
                couleur = 'red'
            else :
                texte = 'Capture d\'écran enregistrée.'
                couleur = 'lightGreen'
        except FileNotFoundError :
            texte = 'scrot n\'est pas installé sur votre système ...'
            couleur = 'red'
        resCapture['text'] = texte
        resCapture['fg'] = couleur
     
     
    root = tk.Tk()
    root.title('Test capture d\'écran sur linux avec scrot')
     
    resCapture = tk.Label(
        bg='black',
        fg='lightBlue',
        width=50,
        text='ctrl gauche + m pour faire une capture'
    )
    resCapture.grid()
     
    can = tk.Canvas(width=300, height=300, bg='#ffff00')
    can.grid()
     
    root.bind('<KeyPress-Control_L><KeyPress-m>', capturerFenetre)
     
    root.mainloop()
    Il me semble que scrot est installé de base sur debian, donc ça doit être idem pour toutes les distibutions dérivées je pense.
    Les autres, fedora, suse, etc, aucune idée.


    Outre le défi de mettre en oeuvre un script utilisant PIL qui est certes plus instructif que d'appeler une bête commande système, ce serait pas plus simple de faire de même avec windows en appelant une commande externe ?
    Le temps ronge l'amour comme l'acide.

Discussions similaires

  1. Enregistrer une image d'un canvas
    Par Maestro64 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 31/01/2014, 08h33
  2. Enregistrer une image à partir d'un canvas
    Par firehist dans le forum Ada
    Réponses: 4
    Dernier message: 18/02/2008, 12h01
  3. [GLScene] Comment enregistrer une image au format TGA
    Par Invité dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 27/05/2005, 15h12
  4. Enregistrer une image
    Par N@sH dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 04/05/2005, 10h07
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2004, 17h18

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