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 :

[TkInter]sélectionner juste une partie d'une image


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [TkInter]sélectionner juste une partie d'une image
    Bonjour

    J'affiche une image jpg via PIL dans un Canvas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    photo=ImageTk.PhotoImage(image)
     
    PartieImage = Canvas(fenetre,bg='grey', width=X+1, height=Y+1)
    PartieImage.create_image(0,0,anchor = NW,image=photo)
    Et j'aimerai pouvoir sélectionner une partie de cette image (en fait récupérer les coordonées de la souris entre un click et une release.

    J'ai essayé de lié ces 2 évènements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PartieImage.bind("<Button-1>", appui)
    PartieImage.bind("<ButtonRelease-1>", relache)
    Mais ca ne fonctionne pas (appui et relache sont des fonctions qui "print" les coordonnées de l'event)

    Quelqu'un aurait-il une idée ?

    Merci.

    JB

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    Je ne comprends pas très bien ton problème, tu cherches juste à récupérer les coordonnées associées à un évènement ?
    Si oui, tes deux fonctions appui() et relache() peuvent très bien s'en charger :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def appui(event):
    	global point1
    	point1 = (event.x, event.y)
     
    def relache(event):
    	global point2
    	point2 = (event.x, event.y)
     
    point1, point2 = (), ()
    Tu peux ainsi avoir accès aux deux coordonnées n'importe où dans ton code.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Salut

    Merci de ta réponse.

    Le problème est qu'avec le code :
    photo=ImageTk.PhotoImage(image)

    PartieImage = Canvas(fenetre,bg='grey', width=X+1, height=Y+1)
    PartieImage.create_image(0,0,anchor = NW,image=photo)

    Je n'arrive pas à récupérer l'évènement : ca ne fonctionne pas : si je clique sur la photo, il ne se passe rien (appui est :
    def appui():
    print str(event.x) + str(event.y)

    Mais ca ne met rien... en fait,il semble qu'il n'arrive pas à repérer la souris sur l'image

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Sans code c'est chaud... alors :

    NB : ce programme est un essai, il est donc peu documenté.

    ce qu'il vous faut :
    Une image "essai.png" de dimension supérieure à 640*480.
    vous la placez dans "votreHOME"/.focus/

    et voila, vous pouvez lancer. Il affiche un bouton, si vous cliquez dessus, il ouvre une deuxieme fenetre ds laquelle il affiche l'image redimensionnée.

    Le probleme (dans afficheimage() ) je n'arrive pas à récupérer les données du click de la souris.

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    from Tkinter import *
    import commands
    import os
    import time
    from PIL import Image, ImageTk 
     
     
    #recupDerniereImage : recupere la derniere image produite
    def recupDerniereImage():  #code de debuggage
        path=os.getcwd()
        os.chdir(path)
        liste_photo=[]
        sortie1,liste_photo=commands.getstatusoutput('gphoto2 -L') #recupere la liste des fichiers
        coupe_sortie=liste_photo.split()
        print coupe_sortie
        nombreSeparation=len(coupe_sortie)
     
        numeroDernierePhoto=nombreSeparation-6
     
        numeroDernierePhoto=coupe_sortie[numeroDernierePhoto]
     
        numeroDernierePhoto=numeroDernierePhoto.replace("#"," ")
     
        numeroDernierePhoto=numeroDernierePhoto.strip()
     
        commandeRecuperationDernierePhoto=str("gphoto2 -p " + str(numeroDernierePhoto))
     
        home = os.getenv("HOME")
        focus=home+"/.focus"
        os.chdir(focus)
        print commandeRecuperationDernierePhoto
        sortie1,recupPhoto=commands.getstatusoutput(commandeRecuperationDernierePhoto) 
        print os.getcwd()
        splitRecupPhoto=recupPhoto.split()
        lastarg=len(splitRecupPhoto)-1
        nomDerniereImage=splitRecupPhoto[lastarg]
        print str(nomDerniereImage)
        #a enelver
        nomDerniereImage="essai.png"
        afficheimage(nomDerniereImage)
     
    def appui(event):
        print "clicked at", event.x, event.y
     
    def relache(event):
        print "Relache a", event.x, event.y
     
     
    def afficheimage(lastimage):
        home = os.getenv("HOME")
        focus=home+"/.focus"
        os.chdir(focus)
        image=Image.open(lastimage) #ouvre /home/chezvous/.focus
        x,y=image.size
        print str(x) + " " + str(y)
        X,Y=int((x*600.0)/y),600 #redimensionne l'image en 600*400
        print str(X) + " " + str(Y)
        image=image.resize((X,Y),Image.BICUBIC)
     
        photo=ImageTk.PhotoImage(image)  #creer le conteneur de l'imageTK
        fenetre2=Toplevel() #ouvre une nouvelle fenetre
        PartieImage = Canvas(fenetre2,bg='grey', width=X+1, height=Y+1) #fait un canevas ds la nouvelle fenetre
        id=PartieImage.create_image(0,0,anchor = NW,image=photo, tags="canvasimage") #affiche l'image avec pour tag canvasimage
        print "id =" + str(id) #affiche l'id de l'image
     
     
        PartieImage.tag_bind('canvasimage',"<Button-1>", appui)  #NE FONCTIONNE PAS : tente de lier a canvasimage l'evenement d'appui
        PartieImage.pack() 
     
        fenetre2.update () #j'ai trouvé que ca pour afficher l'image
     
        time.sleep(30)
        fenetre.destroy()#code de debug
     
     
     
     
    def principal():
        "initialise les fenetres et detecte les appareils photos connectes"
        status,listeAppareil=commands.getstatusoutput('gphoto2 --auto-detect') #recupere la liste des appareils
        listeAppareil=listeAppareil.split()
        i=len(listeAppareil)-4
        appareil=''
        while i<len(listeAppareil)-1:
            appareil=appareil + ' '+ listeAppareil[i]
            i=i+1
            informations.configure(text = "Appareil : " + appareil + " pret")
        #creation du bouton de recuperation d'images
        Button(partiehaute, text="recuperer la derniere image", command=recupDerniereImage).pack()
     
     
    def verifieAPN():
        status,listeAppareil=commands.getstatusoutput('gphoto2 --auto-detect') #recupere la liste des appareils
        listeAppareil=listeAppareil.split()
        print listeAppareil
        if (len(listeAppareil) > 3) :
            appareilOK=True
     
        else:
            appareilOK=False
        return appareilOK
     
    def creerRepertoire():
        home = os.getenv("HOME")
        os.chdir(home)
        focus=home+"/.focus"
        status,output=commands.getstatusoutput('cd '+focus)
        print status
        if (status==0):
            print "focus OK"
        else:
            print "focus NOK"
            os.mkdir(focus)
            print "focuss OK"
     
     
    #------programme principal---------------- Main
     
    #Creation des repertoires de travail
    creerRepertoire()
     
    fenetre=Tk() #fenetre principale
     
    fenetre.title("Focus, aide a la mise au point")
     
     
    informations=Label(fenetre) #fenetre d'informations
    informations.pack()
     
    partiehaute=Canvas(fenetre,bg='dark grey')
    partiehaute.pack()
    informations.configure(text = "Appareil non pret.")
    fenetre.update()
     
    #while verifieAPN()==False:
    #    fenetre.update()
     #   informations.configure(text = "Appareil non pret.")
     #   time.sleep(5)
     
    principal()
     
     
     
    fenetre.mainloop()

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bon ... j'ai toruvé, c'est à cause du garbage : il mettait àla poublle. je l'avais squizzé en mettant un time.sleep, mais ca ne fonctinnait pas pareil.

    Donc, en ajoutant un dictionnaire et en mettant la photo dedans, comme décrit là : http://python.developpez.com/faq/?pa...et#WidgetImage

    ca fonctionne impec.

    merci tout de même

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

Discussions similaires

  1. Copier une partie d'une form dans une image
    Par Duan dans le forum Débuter
    Réponses: 5
    Dernier message: 11/05/2009, 16h16
  2. donner une couleur a une partie d'une forme
    Par ralf91 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2008, 17h02
  3. Réponses: 1
    Dernier message: 04/04/2008, 12h14
  4. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  5. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47

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