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 :

Sélection d'une zone dans un Canvas


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Par défaut Sélection d'une zone dans un Canvas
    Bonjour,

    J'ai créé un programme qui récupère des morceaux de pdf sous forme d'image pour les insérer ensuite dans des powerpoints.
    Le programme fonctionne bien, mais j'aimerai aller plus loin et porposer à l'utilisateur de choisir lui même quelle partie de l'image il veut. Pour l'instant, dans mon script j'utilise le morceau de code ci-desous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from PIL import Image
    for p in range(npage) :
        if p in pages_voulues :
            imPIL = Image.open("Pdf2Jpg_TempOrdner/file_out-%s.png" %str(p))
     
            crop_rectangle = (65, 30, 1110, 750)
            cropped_im = imPIL.crop(crop_rectangle)
            cropped_im.save("Pdf2Jpg_TempOrdner/Final/Bilder-%s.png" %str(p))
        else :
            pass
    Il prend donc toujours la même partie de l'image (ce qui convient très bien pour l'instant vu que les pdf dont les images doivent être extraites ont pour l'instant toujours la même mise en page).

    Ce que j'aimerai pouvoir faire est afficher un apperçu de l'image dans un Canvas (pas de soucis jusque là) et ensuite pouvoir sélectionner sur ce Canvas la zone que l'on veut extraire dans cette image (par exemple en faisant un rectangle de selection comme sous paint, ou alors avec un curseur qu'on bougerait et qui masquerait au fur et à mesure les zones déselectionnées de l'image).

    Quelqu'un aurait une piste là dessus ?

    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Par défaut
    Bon, je pense avoir trouvé une solution (en grande partie grâce à l'exemple http://python.developpez.com/cours/T...=page_16#L14.3) :

    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
    # -*-coding:Utf-8 -*-
    from __future__ import unicode_literals
     
    import Tkinter, PIL, Image, ImageTk
     
    class Interface(Tkinter.Tk) :
        def __init__(self, parent) :
            Tkinter.Tk.__init__(self, parent)
            self.parent = parent 
            self.initialize()
     
        # Creation de nos widgets
        def initialize(self) :
            self.grid()
     
     
            self.apercu_logo="Audi.jpg"
            self.photo = ImageTk.PhotoImage(Image.open(self.apercu_logo))
            self.Largeur = 818
            self.Hauteur = 508
            self.Logo = Tkinter.Canvas(self, width=self.Largeur, height=self.Hauteur)
            self.Logo.config(height=self.photo.height(),width=self.photo.width())
            self.item = self.Logo.create_image(0,0,anchor="nw", image=self.photo)
            self.Logo.grid(column=0, row=0, sticky="EW")
            self.Logo.bind("<Button-1>", self.MouseDown)
            self.Logo.bind("<Button1-Motion>", self.MouseMove)
     
     
        def MouseDown(self, event):
            "Quand on clique gauche"
            self.currObject =None
            # event.x et event.y contiennent les coordonnées du clic effectué
            self.x1, self.y1 = event.x, event.y
     
        def MouseMove(self, event):
            "Quand on bouge la souris bouton gauche enfoncé"
            self.x2, self.y2 = event.x, event.y
            #self.dx, self.dy = self.x3 -self.x1, self.y3 -self.y1
            self.Position = list()
            if self.x1 < self.x2 :
                self.Position.append(self.x1)
                if self.y1 < self.y2 :
                    self.Position.append(self.y1)
                    self.Position.append(self.x2)
                    self.Position.append(self.y2)
                else :
                    self.Position.append(self.y2)
                    self.Position.append(self.x2)
                    self.Position.append(self.y1)
            else :
                self.Position.append(self.x2)
                if self.y1 < self.y2 :
                    self.Position.append(self.y1)
                    self.Position.append(self.x1)
                    self.Position.append(self.y2)
                else :
                    self.Position.append(self.y2)
                    self.Position.append(self.x1)
                    self.Position.append(self.y1)
     
            try :
                self.Logo.delete(self.rectangle)
                self.rectangle = self.Logo.create_rectangle(self.Position[0], self.Position[1],\
                                                      self.Position[2], self.Position[3], \
                                                      outline='red', width=2)
            except :
                self.rectangle = self.Logo.create_rectangle(self.Position[0], self.Position[1],\
                                                      self.Position[2], self.Position[3], \
                                                      outline='red', width=2)
     
    if __name__ == "__main__" :
                  app = Interface(None)
                  app.title("Bilderteil Wähler - Aegim")
                  app.mainloop()
    Ensuite il suffit de stocker self.Position dans le crop_rectangle que j'utilisais dans l'exemple du premier post.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Par défaut
    Bonjour,

    Je rencontre un nouveau problème avec cette selection dans le Canvas. J'ai ajouté une scrollbar au Canvas, mais quand la scrollbarr est utiliséele pointeur de la souris est ensuite décalé par rapport à la zone sélectionnée. Ca me semble pas très clair dit comme ça, donc je vous mets 2 images. La première est ce qui arrive lorsque l'on n'a pas utilisé la scrollbar :



    La seconde, une fois la scrollbar bougée, on peut constater que la zone sélectionnée est déplacée par rapport à la souris, et ce proportionellement au déplacement de la scrollbar :



    Quelqu'un saurait comment régler ce problème ?

    Merci d'avance

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Par défaut
    Bon, ça commence à faire monologue sur ce poste, mais en faisant des recherches plus approfondies j'ai fini par trouver comment régler le problème.

    Il suffit de remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.x2, self.y2 = event.x, event.y
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.x2 = self.fenetreWahl.BilderWahl.canvasx(event.x)
    self.y2 = self.fenetreWahl.BilderWahl.canvasy(event.y)
    Pour la définition des coordonnées.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/02/2014, 16h43
  2. Réponses: 1
    Dernier message: 24/10/2007, 15h56
  3. Réponses: 29
    Dernier message: 03/11/2005, 10h37
  4. Remplissage d'une zone d'un canvas
    Par ulysse66x dans le forum Composants VCL
    Réponses: 5
    Dernier message: 31/01/2004, 12h41
  5. Déplacer la sélection d'une ligne dans un stringgrid
    Par jer64 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 14/03/2003, 00h57

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