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 :

Drag and Drop tkinter


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Drag and Drop tkinter
    Bonjour,
    je programme un tower defense pour le bac et je suis bloqué sur le fait de pouvoir sélectionner les tours et les déplacer là ou on veut les construire.
    je n'arrive pas a faire en sorte que ma nouvelle image créée suive mon curseur.
    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
    class Tour:
     
        def __init__(self):
            self.damage = 0
            self.x = 900 + 75/2
            self.y = 75/2
            self.image = can.create_image(self.x, self.y, image=tour, anchor = CENTER)
            self.DETECTION_CLIC_SUR_OBJET = False # on initialise la variable
            can.bind( '<Button-1>', self.clic ) # associe clic sur can à fonction Clic de l'instance ( renvoie automatiquement en arguments : instance et evenement
            can.bind('<Motion>',self.drag)
            can.bind( '<Button-1>', self.drop )
     
        def clic(self,event): # on recupere l'instance et l'evenement, avec self et event en nom de variable ( rappel : tu peux mettre ce que tu veux en nom de variable )
            """ Gestion de l'événement Clic gauche """
     
            # position du pointeur de la souris
            X = event.x
            Y = event.y
            if self.DETECTION_CLIC_SUR_OBJET==False:
                if self.x-75/2 <= X <= self.x+75/2 and self.y-75/2 <= Y <= self.y+75/2:
                    self.DETECTION_CLIC_SUR_OBJET = True
                    self.tour_a_deplacer=can.create_image(X, Y, image=tour, anchor = CENTER)
                else:
                    self.DETECTION_CLIC_SUR_OBJET = False
     
        def drag(self,event):
            """ Gestion de l'événement bouton gauche enfoncé """
            X = event.x
            Y = event.y
     
            if self.DETECTION_CLIC_SUR_OBJET == True:# limite de l'objet dans la zone graphique
                if X < 0: X = 0
                if X > largeur: X = largeur
                if Y < 0: Y = 0
                if Y > hauteur: Y = hauteur
                can.coords (self.tour_a_deplacer,X,Y)
     
        def drop(self, event):
            X = event.x
            Y = event.y
            if self.DETECTION_CLIC_SUR_OBJET ==  True:
                can.coords(self.tour_a_deplacer,X,Y)
                self.DETECTION_CLIC_SUR_OBJET=False

  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 781
    Points
    36 781
    Par défaut
    Salut,

    C'est pas facile... et on se simplifiera beaucoup la vie en utilisant au mieux les fonctionnalités du Canvas. Ce qui donne un code du genre:
    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
    import tkinter as tk
    from tkinter.constants import * 
     
    class Canvas(tk.Canvas):
        selected = None
        last_xy = None
     
        def bind_item(self):
            self.tag_bind('copy_and_drop', "<ButtonPress-1>", self.on_item_click)
            self.tag_bind('copy_and_drop', "<Button1-Motion>",
                          lambda e: self._move_selected(e.x, e.y))
            self.tag_bind('copy_and_drop', "<ButtonRelease-1>",
                          lambda e: self._move_selected(e.x, e.y, 0))
     
        def _move_selected(self, x1, y1, min_pixels=5):
            x0, y0 = self.last_xy
            dx, dy = x1 - x0, y1 - y0
            if abs(dx) > min_pixels or abs(dy) > min_pixels:
                self.move(self.selected, dx, dy)
                self.last_xy = x1, y1
     
        def on_item_click(self, event):
            iid = self.find_withtag('current')
            self.selected = self._copy_item(iid)
            self.last_xy = event.x, event.y
     
        def _copy_item(self, iid):
            type_ = self.type(iid)
            assert type_ == 'oval'
            coords = self.coords(iid)
            kwds = self.itemconfigure(iid)
            kwds = { k: v[-1] for k, v in kwds.items() if k != 'tags' }
            return self.create_oval(*coords, **kwds)
     
    if __name__ == '__main__':
        c = Canvas()
        c.pack(fill=BOTH, expand=YES)
        c.create_oval(10, 10, 150, 100, fill='blue', tag='copy_and_drop',
                            activeoutline='red', activewidth=3)
        c.bind_item()
        tk.mainloop()
    qui illustre la logique mais qu'il faudra comprendre avant de l'adapter à votre cas.

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. "Drag and drop" avec directinput
    Par batosai dans le forum DirectX
    Réponses: 1
    Dernier message: 16/06/2004, 16h48
  3. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  4. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  5. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

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