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 :

supprimer un objet sous condition


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut supprimer un objet sous condition
    Bonjour à tous, je fais un projet de tri sélectif, et j'aimerais faire en sorte que quand on place une image (objet) dans une certaine zone (la bonne poubelle), elle disparaisse. J'ai essayé de faire avec les coordonnées, mais ça ne s'avère pas fructueux ... J'utilise le fameux "canvas.delete". Si quelqu'un sait comment faire, ça serait merveilleux !!! Je vous met mon code :
    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    from Tkinter import *
    from PIL import Image, ImageTk
     
    def poubelle_1(): #on definit la premiere poubelle pour les materiaux recyclables
        can1.create_rectangle(10,250,300,600,fill='yellow')
        can1.create_rectangle(20,280,290,500,fill='black')
     
    def poubelle_2(): #on definit la deuxieme poubelle pour le verre
        can1.create_rectangle(400,250,700,600,fill='green')
        can1.create_rectangle(410,280,690,500,fill='black')
     
    def poubelle_3(): #troisieme et derniere poubelle pour tout ce qui est alimentaire
        can1.create_rectangle(790,250,1090,600,fill='grey')
        can1.create_rectangle(800,280,1080,500,fill='black')
     
    def clic(event): #fonction qui va permettre de detecter le clic
        global DETECTION_CLIC_SUR_OBJET, DETECTION_CLIC_SUR_OBJET_2, DETECTION_CLIC_SUR_OBJET_3, DETECTION_CLIC_SUR_OBJET_4, DETECTION_CLIC_SUR_OBJET_5, DETECTION_CLIC_SUR_OBJET_6, oldpos
        X = event.x 
        Y = event.y
        left, top = can1.coords(IMAGE_1)
        left2, top2 = can1.coords(IMAGE_2)
        left3, top3 = can1.coords(IMAGE_3)
        left4, top4 = can1.coords(IMAGE_4)
        left5, top5 = can1.coords(IMAGE_5)
        left6, top6 = can1.coords(IMAGE_6) #on definit nos variables et on donne une valeur
        # on connait les dimensions de l'image 
        left -= 64
        top -= 95
        left2 -= 61
        top2 -= 92
        left3 -= 120
        top3 -= 97
        left4 -= 100
        top4 -= 100
        left5 -=54
        top5 -=90
        left6 -=94
        top6 -=94
        right, bottom = left + 128, top + 190
        right2, bottom2 = left2 + 123, top2 + 184
        right3, bottom3 = left3 + 239, top3 + 194
        right4, bottom4 = left4 + 200, top4 + 200
        right5, bottom5 = left5 + 108, top5 + 180
        right6, bottom6 = left6 + 188, top6 + 188
        if left <= X <= right and top <= Y <= bottom: #on fait en sorte que le clic detecte l objet le plus proche (jusqu au else plus bas)
            DETECTION_CLIC_SUR_OBJET = True
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = False
            oldpos = X, Y
        elif left2 <= X <= right2 and top2 <= Y <= bottom2:
            DETECTION_CLIC_SUR_OBJET_2 = True
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = False
            oldpos = X, Y
        elif left3 <= X <= right3 and top3 <= Y <= bottom3:
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = True
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = False
            oldpos = X, Y
        elif left4 <= X <= right4 and top4 <= Y <= bottom4:
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = True
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = False
            oldpos = X, Y
        elif left5 <= X <= right5 and top5 <= Y <= bottom5:
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = True
            DETECTION_CLIC_SUR_OBJET_6 = False
            oldpos = X, Y 
        elif left6 <= X <= right6 and top6 <= Y <=  bottom6:
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = True
            oldpos = X, Y
        else: 
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = False
     
    def drag(event): #on definit une fonction pour le mouvement des objets
        global oldpos
        X = event.x
        Y = event.y
        if DETECTION_CLIC_SUR_OBJET == True : #on evite les bugs
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0] # X est la coordonnee horizontale du clic et oldpos[0] est la position precedente de l abscisse
            movey = Y - oldpos[1] # pareil a la verticale
            can1.move(IMAGE_1, movex, movey) #on fait bouger l image
            oldpos = X, Y #on attribue au clic la position
        elif DETECTION_CLIC_SUR_OBJET_2 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_2, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_3 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_3, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_4 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_4, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_5 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_5, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_6 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_6, movex, movey)
            oldpos = X, Y
     
    #on initialise les variables :
    DETECTION_CLIC_SUR_OBJET = False
    DETECTION_CLIC_SUR_OBJET_2 = False
    DETECTION_CLIC_SUR_OBJET_3 = False
    DETECTION_CLIC_SUR_OBJET_4 = False
    DETECTION_CLIC_SUR_OBJET_5 = False
    DETECTION_CLIC_SUR_OBJET_6 = False
    oldpos = 0, 0
     
    #on cree notre fenetre
    fen1 = Tk()
    #on ouvre les images
    image = Image.open("banane_petite.jpg")
    image1 = Image.open("bouteille_verre.jpg")
    image2 = Image.open("carton.jpg")
    image3 = Image.open("bouteille_plastique.jpg")
    image4 = Image.open("canette.jpg")
    image5 = Image.open("journal.jpg")
    #par cette methode, on permet a l image d apparaitre dans un canevas
    photo = ImageTk.PhotoImage(image)
    photo1 = ImageTk.PhotoImage(image1)
    photo2 = ImageTk.PhotoImage(image2)
    photo3 = ImageTk.PhotoImage(image3)
    photo4 = ImageTk.PhotoImage(image4)
    photo5 = ImageTk.PhotoImage(image5)
    #on cree notre canevas
    can1 = Canvas(fen1,bg='white',height=600,width=1100)
    #on cree les images dans notre canevas
    IMAGE_1 = can1.create_image(60,100,image=photo)
    IMAGE_2 = can1.create_image(200,100,image=photo1)
    IMAGE_3 = can1.create_image(360,100,image=photo2)
    IMAGE_4 = can1.create_image(560,100,image=photo3)
    IMAGE_5 = can1.create_image(750,100,image=photo4)
    IMAGE_6 = can1.create_image(950,100,image=photo5)
     
    #on attribue les fonctions "clic" et "drag" a une entree de peripherique (le clic gauche pour "clic", et le clic gauche maintenu pour "drag")
    can1.bind('<Button-1>',clic)
    can1.bind('<B1-Motion>',drag)
    can1.focus_set()
    can1.pack(side=TOP)
    #on appelle les fonctions
    poubelle_1()
    poubelle_2()
    poubelle_3()
    jeu()
    #on cree un bouton pour quitter le programme
    bou1 = Button(fen1,text='Quitter',command=fen1.quit)
    bou1.pack(side=BOTTOM)
     
    fen1.mainloop()
    fen1.destroy()
    (j'ai pas encore enlevé tout ce qui sert à rien, mais je vais le faire )

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

    canvas.delete fonctionne et c'est la seule méthode à utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import tkinter as tk
    >>> canvas = tk.Canvas()
    >>> canvas.pack()
    >>> iid = canvas.create_rectangle(0, 0, 100, 100, fill='red')
    >>> canvas.delete(iid)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    oui, ça je l'avais compris, ce que je n'arrive pas à faire c'est le faire sous une condition, j'ai essayé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if  790<=left<=1090 and 250<=top<=600 :
    can1.delete(IMAGE_1)
    mais ça ne marche pas dans mon code ... (ce que j'ai fait, c'est par rapport aux variables de mon code, hein )

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par jojodugard Voir le message
    oui, ça je l'avais compris, ce que je n'arrive pas à faire c'est le faire sous une condition, j'ai essayé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if  790<=left<=1090 and 250<=top<=600 :
    can1.delete(IMAGE_1)
    mais ça ne marche pas dans mon code ... (ce que j'ai fait, c'est par rapport aux variables de mon code, hein )
    Ben ajoutez un "print" qui affiche un petit message pour vérifier que la condition est "vraie" de temps en temps.
    (apprendre à mettre au point son code fait aussi partie de l'exercice, non?)

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Bon, j'ai fait comme vous m'avez dit, et j'ai trouvé pourquoi ça ne marche pas (c'est un début ) : enfaite, les variables (left et top en l'occurence) ne sont pas réactualisées, elles gardent les mêmes valeur qu'au début ... J'ai essayé de faire une boucle infinie pour que les coordonnées soient réactualisées, mais le programme est dépassé, et le canevas ne s'ouvre plus ... Je n'ai jamais appris à réactualiser un canevas, y a t-il une fonction qui permet de le faire ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par jojodugard Voir le message
    Bon, j'ai fait comme vous m'avez dit, et j'ai trouvé pourquoi ça ne marche pas (c'est un début ) : enfaite, les variables (left et top en l'occurence) ne sont pas réactualisées, elles gardent les mêmes valeur qu'au début ... J'ai essayé de faire une boucle infinie pour que les coordonnées soient réactualisées
    Une variable n'est jamais mise à jour par magie: il faut lui assigner une nouvelle valeur/objet.
    Vous avez aussi des questions de "portée": mettre à jour une variable "locale" à une fonction ne la mettra pas à jour utilisée dans une autre fonction.
    Pourquoi ne pas aller revoir vos cours/tutos préférés sur ces sujets?

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

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Justement ... Le problème, c'est que je n'ai jamais rien vu de tel ... Et enfaite, je pense que je me suis mal exprimé : ce que je cherche à faire, c'est avoir les coordonnées d'un objet admettons toutes les 3 sec, comme si c'était un "GPS" qui localiserait l'objet et donnerait ses nouvelles coordonnées ... Je ne cherche pas à lui attribuer une valeur, au contraire, je cherche à ce que si les coordonnées sont comprises entre telle et telle valeur, on supprime l'image. En gros, est-ce qu'il y a un outil qui permet qu'à intervalle de temps régulier, on mesure les coordonnées, par exemple ? (Je ne suis vraiment pas un expert, et je ne connais pas beaucoup de site qui font des tutos ... Je manque un peu de ressources, il est vrai ^^)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par jojodugard Voir le message
    Justement ... Le problème, c'est que je n'ai jamais rien vu de tel ... Et enfaite, je pense que je me suis mal exprimé : ce que je cherche à faire, c'est avoir les coordonnées d'un objet admettons toutes les 3 sec, comme si c'était un "GPS" qui localiserait l'objet et donnerait ses nouvelles coordonnées ...
    Pour l'instant, vous déplacez l'objet dans la poubelle, lorsqu'il est dedans, il faut éventuellement lui appliquer .delete.
    Ce que vous regardez c'est la position de l'objet après chaque déplacement...

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

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Oui, c'est ce que je cherche à faire, mais je n'y parviens pas : j'ai essayé avec la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if DETECTION_CLIC_SUR_OBJET == True :
    left, top = can1.coords(IMAGE_1)
    mais enfaite, même le can1.coords(IMAGE_1) ne change pas de valeur ... Je ne vois pas comment je peux récupérer les nouvelles valeurs enfaite, c'est peut-être simple, mais j'ai beau chercher, je ne trouve pas ... Je pense que je suis carrément à côté de la plaque là :/ Si vous pouviez me donner une piste (une action à faire qui me débloquerait pour chercher les nouvelles valeurs), ça serait super, parce que pour le coup, je n'ai plus d'idée ...

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par jojodugard Voir le message
    Oui, c'est ce que je cherche à faire, mais je n'y parviens pas : j'ai essayé avec la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if DETECTION_CLIC_SUR_OBJET == True :
    left, top = can1.coords(IMAGE_1)
    mais enfaite, même le can1.coords(IMAGE_1) ne change pas de valeur ... Je ne vois pas comment je peux récupérer les nouvelles valeurs enfaite, c'est peut-être simple, mais j'ai beau chercher, je ne trouve pas ... Je pense que je suis carrément à côté de la plaque là :/ Si vous pouviez me donner une piste (une action à faire qui me débloquerait pour chercher les nouvelles valeurs), ça serait super, parce que pour le coup, je n'ai plus d'idée ...

    A la base, çà fonctionne assez simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import tkinter as tk
    >>> canvas = tk.Canvas()
    >>> image = tk.PhotoImage(file='edit_16x16.gif')
    >>> iid = canvas.create_image(10, 10, image=image)
    >>> canvas.pack()
    >>> canvas.coords(iid)
    [10.0, 10.0]
    >>> canvas.move(iid, 30, 30)
    >>> canvas.coords(iid)
    [40.0, 40.0]
    >>>
    Donc ca se passe dans le code que vous ne montrez pas.

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

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    ah ! ça y est, j'ai compris !!! merci j'ai essayé et ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    movex = X - oldpos[0] # X est la coordonnee horizontale du clic et oldpos[0] est la position precedente de l abscisse
    movey = Y - oldpos[1] # pareil a la verticale
    can1.move(IMAGE_1, movex, movey) #on fait bouger l image
    left, top =can1.coords(IMAGE_1)#on met à jour les coordonnees de l image
    print (can1.coords(IMAGE_1))
    if 790 <= left <= 1090 and 250 <= top <= 600 :
          can1.delete(IMAGE_1)
    Cependant, lorsque l'image est supprimée, le programme plante, parce que, du fait de sa suppression, il n'y a plus de coordonnées, mais ça met toujours les coordonnées à jour, donc left et top sont assignés à aucune valeur, j'ai essayé de rajouter un del :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            movex = X - oldpos[0] # X est la coordonnee horizontale du clic et oldpos[0] est la position precedente de l abscisse
            movey = Y - oldpos[1] # pareil a la verticale
            can1.move(IMAGE_1, movex, movey) #on fait bouger l image
            left, top =can1.coords(IMAGE_1)#on met à jour les coordonnees de l image
            print (can1.coords(IMAGE_1))
            if 790 <= left <= 1090 and 250 <= top <= 600 :
                can1.delete(IMAGE_1)
                del left
                del top
    mais ça ne fonctionne pas :/ Désolé de vous solliciter aussi souvent, mais je ne suis vraiment pas doué :/

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

    Lorsque l'item du canvas est supprimé (image ou autre), Tk ne râle pas lorsqu'on utilise encore son identifiant (IMAGE_1) pour des opérations comme .move ou .coords.
    Par contre çà ne fera pas grand chose... .coords se contentera de retourner la liste vide [].
    A vous d'écrire plus proprement votre code pour ne pas appeler .coords dans ce cas la: çà ne sert plus à rien.

    Mais vous ne montrez pas assez de code pour qu'on voit comment imaginer le modifier sans avoir à tout changer et/ou vous recommander quelques lectures pour que vous changiez un peu votre code.

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

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Je ne suis pas certain de tout avoir compris ... En tous cas, voici mon code :
    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    from Tkinter import *
    from PIL import Image, ImageTk
     
    def poubelle_1(): #on definit la premiere poubelle pour les materiaux recyclables
        can1.create_rectangle(10,250,300,600,fill='yellow')
        can1.create_rectangle(20,280,290,500,fill='black')
     
    def poubelle_2(): #on definit la deuxieme poubelle pour le verre
        can1.create_rectangle(400,250,700,600,fill='green')
        can1.create_rectangle(410,280,690,500,fill='black')
     
    def poubelle_3(): #troisieme et derniere poubelle pour tout ce qui est alimentaire
        can1.create_rectangle(790,250,1090,600,fill='grey')
        can1.create_rectangle(800,280,1080,500,fill='black')
     
    def clic(event): #fonction qui va permettre de detecter le clic
        global DETECTION_CLIC_SUR_OBJET, DETECTION_CLIC_SUR_OBJET_2, DETECTION_CLIC_SUR_OBJET_3, DETECTION_CLIC_SUR_OBJET_4, DETECTION_CLIC_SUR_OBJET_5, DETECTION_CLIC_SUR_OBJET_6, oldpos
        X = event.x 
        Y = event.y
        left, top = can1.coords(IMAGE_1)
        left2, top2 = can1.coords(IMAGE_2)
        left3, top3 = can1.coords(IMAGE_3)
        left4, top4 = can1.coords(IMAGE_4)
        left5, top5 = can1.coords(IMAGE_5)
        left6, top6 = can1.coords(IMAGE_6) #on definit nos variables et on donne une valeur
        # on connait les dimensions de l'image 
        left -= 64
        top -= 95
        left2 -= 61
        top2 -= 92
        left3 -= 120
        top3 -= 97
        left4 -= 100
        top4 -= 100
        left5 -=54
        top5 -=90
        left6 -=94
        top6 -=94
        right, bottom = left + 128, top + 190
        right2, bottom2 = left2 + 123, top2 + 184
        right3, bottom3 = left3 + 239, top3 + 194
        right4, bottom4 = left4 + 200, top4 + 200
        right5, bottom5 = left5 + 108, top5 + 180
        right6, bottom6 = left6 + 188, top6 + 188
        if left <= X <= right and top <= Y <= bottom: #on fait en sorte que le clic detecte l objet le plus proche (jusqu au else plus bas)
            DETECTION_CLIC_SUR_OBJET = True
            oldpos = X, Y
        elif left2 <= X <= right2 and top2 <= Y <= bottom2:
            DETECTION_CLIC_SUR_OBJET_2 = True
            oldpos = X, Y
        elif left3 <= X <= right3 and top3 <= Y <= bottom3:
            DETECTION_CLIC_SUR_OBJET_3 = True
            oldpos = X, Y
        elif left4 <= X <= right4 and top4 <= Y <= bottom4:
            DETECTION_CLIC_SUR_OBJET_4 = True
            oldpos = X, Y
        elif left5 <= X <= right5 and top5 <= Y <= bottom5:
            DETECTION_CLIC_SUR_OBJET_5 = True
            oldpos = X, Y 
        elif left6 <= X <= right6 and top6 <= Y <=  bottom6:
            DETECTION_CLIC_SUR_OBJET_6 = True
            oldpos = X, Y
        else: 
            DETECTION_CLIC_SUR_OBJET = False
            DETECTION_CLIC_SUR_OBJET_2 = False
            DETECTION_CLIC_SUR_OBJET_3 = False
            DETECTION_CLIC_SUR_OBJET_4 = False
            DETECTION_CLIC_SUR_OBJET_5 = False
            DETECTION_CLIC_SUR_OBJET_6 = False
     
    def drag(event): #on definit une fonction pour le mouvement des objets
        global oldpos
        X = event.x
        Y = event.y
        if DETECTION_CLIC_SUR_OBJET == True : #on evite les bugs
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0] # X est la coordonnee horizontale du clic et oldpos[0] est la position precedente de l abscisse
            movey = Y - oldpos[1] # pareil a la verticale
            can1.move(IMAGE_1, movex, movey) #on fait bouger l image
            left, top =can1.coords(IMAGE_1)#on met à jour les coordonnees de l image
            print (can1.coords(IMAGE_1))
            if 790 <= left <= 1090 and 250 <= top <= 600 :
                can1.delete(IMAGE_1)
            oldpos = X, Y #on attribue au clic la position
        elif DETECTION_CLIC_SUR_OBJET_2 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_2, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_3 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_3, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_4 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_4, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_5 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_5, movex, movey)
            oldpos = X, Y
        elif DETECTION_CLIC_SUR_OBJET_6 == True :
            if X < 0: 
                X = 0
            elif X > 1100: 
                X = 1100
            if Y < 0: 
                Y = 0
            if Y > 600: 
                Y = 600
            movex = X - oldpos[0]
            movey = Y - oldpos[1]
            can1.move(IMAGE_6, movex, movey)
            oldpos = X, Y
     
     
     
    #on initialise les variables :
    DETECTION_CLIC_SUR_OBJET = False
    DETECTION_CLIC_SUR_OBJET_2 = False
    DETECTION_CLIC_SUR_OBJET_3 = False
    DETECTION_CLIC_SUR_OBJET_4 = False
    DETECTION_CLIC_SUR_OBJET_5 = False
    DETECTION_CLIC_SUR_OBJET_6 = False
    oldpos = 0, 0
     
    #on cree notre fenetre
    fen1 = Tk()
    #on ouvre les images
    image = Image.open("banane_petite.jpg")
    image1 = Image.open("bouteille_verre.jpg")
    image2 = Image.open("carton.jpg")
    image3 = Image.open("bouteille_plastique.jpg")
    image4 = Image.open("canette.jpg")
    image5 = Image.open("journal.jpg")
    #par cette methode, on permet a l image d apparaitre dans un canevas
    photo = ImageTk.PhotoImage(image)
    photo1 = ImageTk.PhotoImage(image1)
    photo2 = ImageTk.PhotoImage(image2)
    photo3 = ImageTk.PhotoImage(image3)
    photo4 = ImageTk.PhotoImage(image4)
    photo5 = ImageTk.PhotoImage(image5)
    #on cree notre canevas
    can1 = Canvas(fen1,bg='white',height=600,width=1100)
    #on cree les images dans notre canevas
    IMAGE_1 = can1.create_image(60,100,image=photo)
    IMAGE_2 = can1.create_image(200,100,image=photo1)
    IMAGE_3 = can1.create_image(360,100,image=photo2)
    IMAGE_4 = can1.create_image(560,100,image=photo3)
    IMAGE_5 = can1.create_image(750,100,image=photo4)
    IMAGE_6 = can1.create_image(950,100,image=photo5)
    #on attribue les fonctions "clic" et "drag" a une entree de peripherique (le clic gauche pour "clic", et le clic gauche maintenu pour "drag")
    can1.bind('<Button-1>',clic)
    can1.bind('<B1-Motion>',drag)
    can1.focus_set()
    can1.pack(side=TOP)
    #on appelle les fonctions
    poubelle_1()
    poubelle_2()
    poubelle_3()
    #on cree un bouton pour quitter le programme
    bou1 = Button(fen1,text='Quitter',command=fen1.quit)
    bou1.pack(side=BOTTOM)
     
    fen1.mainloop()
    fen1.destroy()
    Et voici le code que m'envoie python lorsque je clique n'importe où sur le canevas une fois que l'image est supprimée (je ne l'ai fait que pour une image pour l'instant, mais je vais le faire pour toutes les images), à savoir, je ne peux plus rien faire une fois que ce message s'affiche, plus aucune image ne bouge ni rien ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
        return self.func(*args)
      File "C:\Users\Jonathan\Desktop\Lycée albert camus\ISN\python\projet ISN\test_projet_recyclage.py", line 87, in drag
        left, top =can1.coords(IMAGE_1)#on met à jour les coordonnees de l image
    ValueError: need more than 0 values to unpack

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

    Votre code est difficile à lire.
    Ceci dit soyez logique, lorsque vous avez détruit IMAGE_1, via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if 790 <= left <= 1090 and 250 <= top <= 600 :
                can1.delete(IMAGE_1)
    DETECTION_CLIC_SUR_OBJET devrait être False et impossible à repasser à True.

    Ca serait peut être pas mal de mettre tout çà de côté et de déplacer des cercles dans un carré.
    histoire de remettre à plat la logique:
    1. sélection d'un cercle
    2. déplacement du cercle sélectionné,
    3. si le bouton de la souris est relâché lorsque le cercle est dans le carré, le cercle disparaît.


    Dans ce cas, vous n'avez plus besoin de toutes ces variables, juste savoir s'il y a un cercle selectionné ou pas.
    Ca évite les répétitions et de se retrouver avec +200 lignes de code qui ne sont que des cut&paste.

    C'est vous qui voyez.

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

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Je vois ce que vous voulez que je fasse, mais je ne sais pas comment m'y prendre autrement que comme j'ai fais enfaite ... Je suis un peu nul en programmation, et je ne savais pas faire ça à la base, je n'ai appris qu'en faisant ça ... Pour sélectionner un cercle, on est bien obligé de vérifier ses coordonnées et les coordonnées du clic, non ? et pour le déplacer, il faut utiliser move. Donc je ne vois pas comment faire autrement enfaite :/

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par jojodugard Voir le message
    Je vois ce que vous voulez que je fasse, mais je ne sais pas comment m'y prendre autrement que comme j'ai fais enfaite ... Je suis un peu nul en programmation, et je ne savais pas faire ça à la base, je n'ai appris qu'en faisant ça ... Pour sélectionner un cercle, on est bien obligé de vérifier ses coordonnées et les coordonnées du clic, non ? et pour le déplacer, il faut utiliser move. Donc je ne vois pas comment faire autrement enfaite :/
    Les tutos sont faits pour vous.
    Regardez par exemple ici.
    C'est écrit en français et çà vous donnera peut être des idées.

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

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    J'ai regardé, et c'est vrai que c'est plus "simple". Cependant, je ne vois pas comment, avec cette méthode, on puisse faire faire au programme : "si l'objet est déposé à tel endroit, il est détruit". Car il n'y a aucune référence aux objets qui l'entourent. Enfin ... Je me trompe certainement ^^

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par jojodugard Voir le message
    J'ai regardé, et c'est vrai que c'est plus "simple". Cependant, je ne vois pas comment, avec cette méthode, on puisse faire faire au programme : "si l'objet est déposé à tel endroit, il est détruit". Car il n'y a aucune référence aux objets qui l'entourent. Enfin ... Je me trompe certainement ^^
    "si l'objet est déposé à tel endroit, il est détruit" est un test à ajouter lorsqu'on relâche le bouton de la souris.
    La structure générale du programme reste semblable.

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

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Oui, mais comment le traduire en langage python sans utiliser les coordonnées ?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/11/2011, 01h59
  2. [XL-2003] Supprimer une ligne sous condition de date
    Par fortbelin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/09/2011, 22h37
  3. [XL-2007] Macro pour supprimer des lignes sous conditions de valeur de cellule
    Par frisco75 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/09/2011, 15h33
  4. [XL-2007] Code VBA pour supprimer des lignes sous condition - problème
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/06/2011, 10h09
  5. supprimer des objets sous une condition
    Par NulenVBA dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/12/2008, 14h39

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