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 :

Savoir la condition pour effectuer une action


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Points : 22
    Points
    22
    Par défaut Savoir la condition pour effectuer une action

    Bonjour,
    Mon code permet de créer 36 carrés de couleur bleu grâce à une liste, je souhaiterais pouvoir faire une action du type :

    "Si ma souris clique sur le premier carré"
    canvas.itemconfig(liste_carre[1],fill="red")


    En d'autres termes j'aimerais pouvoir faire que si je clique sur un carré de mon choix alors il se passe l'action que je choisirais uniquement pour lui ou pour d'autre carré en fonction de l'action que je lui affecterais.

    Je ne trouve la condition pour pouvoir dire"si je clique à tel endroit alors faire ..." car je ne connais pas les coordonnées de chacun de mes carrés pour pouvoir utiliser la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( ...<ev.x<... and ...<ev.y<...):
    canvas.itemconfig(.......)
    Pouvez vous m'aider ?

    Voici mon code
    Fait avec edupython

    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
    from tkinter import*
    fenetre=Tk()
     
    canvas=Canvas(fenetre,height=575,width=575)
    canvas.pack(side=LEFT)
     
    liste_carres=[]
     
    for k in range(36):
        colonne=k%6
        ligne=k//6
        a=5+colonne*95
        b=5+ligne*95
        c=a+85
        d=b+85
        liste_carres.append(canvas.create_rectangle(a,b,c,d,fill='blue'))
     
    fenetre.mainloop()

  2. #2
    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.

    Citation Envoyé par reborn1234 Voir le message
    Je ne trouve la condition pour pouvoir dire"si je clique à tel endroit alors faire ..." car je ne connais pas les coordonnées de chacun de mes carrés pour pouvoir utiliser la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( ...<ev.x<... and ...<ev.y<...):
    canvas.itemconfig(.......)
    Tu sais récupérer la coordonnée du clic souris, pour récupérer les coordonnées de chacun de tes rectangles, il suffit de parcourir ta liste et d'utiliser la méthode Canvas.coords de tkinter et de regarder si ev.x et ev.y se situe à l'intérieur.
    Mais tkinter propose une solution encore plus simple avec la méthode Canvas.find_overlapping.

    Je te laisse te renseigner là-dessus, les exemples ne manquant pas sur internet.
    Le temps ronge l'amour comme l'acide.

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

    Citation Envoyé par reborn1234 Voir le message
    En d'autres termes j'aimerais pouvoir faire que si je clique sur un carré de mon choix alors il se passe l'action que je choisirais uniquement pour lui ou pour d'autre carré en fonction de l'action que je lui affecterais.
    Avec un tableau de 6 x 6 carrés, vous savez qu'en divisant les coordonnées (x, y) du point où on clique par le côté, vous allez obtenir un (i, j). Si vous utilisiez une liste de listes, vous auriez le carré correspondant, mais z = 6*i + j, vous donnerait l'index dans votre liste.

    Après il faut ouvrir la documentation du Canvas. Utiliser canvas.coords comme suggéré par Bistouille est une option.
    Vous pouvez aussi chercher les carrés qui recouvrent le point (x, y) (via .find_overlapping).
    Plus sioux est d'utiliser des "tags": les carrés sont associés au même tag, on fait un bind des objets qui ont ce tag là. Le callback associé ne sera appelé que lorsqu'on clique sur un des carrés (ils peuvent être n'importe où). Et Tk a le bon goût de lui assigner le tag "current".


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

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Merci de vos réponses,
    Pour ce qui est de la méthode find_overlapping je n'ai pas compris comment cela s'utilise ou plutôt à quoi correspondent les (x1,x2,y1,y2)

    1. 1

    J'ai réussi quelque chose avec la méthode avec le tag "current"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def couleur(event):
        couleur = canvas.find_withtag("current")
        canvas.itemconfig(couleur, fill="red")
     
    canvas.bind('<Button-1>',couleur)
    Mais mon souci est qu'il faudrait que la fonction qui change la couleur sur clic de la souris ne marche que sur un certain nombre de carré, par exemple que sur les 3 premiers et pas sur n'importe quel carré.

    1. 2

    Pour la méthode où il faut récupérer les coordonnées des carrés j'ai fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def position(event):
        print("position de la souris sur l'écran :")
        print('abscisse :',event.x_root)
        print('ordonnée :',event.y_root)
     
    canvas.bind('<Button-1>', position)
    Je peux continuer avec cette méthode ou cela va faire trop long vous pensez ?

    1. 3

    PS : j'ai aussi fait une fonction qui me donne l'identifiant de chaque carré lorsque je clique dessus mais je ne sais pas si elle est utile, je la montre quand même au cas où je puisse faire quelque chose avec cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def action(ev): #donne l'identifiant du carré
        ligne=ev.x//95
        colonne=ev.y//95
        k=6*colonne+ligne
        print(k)
     
    canvas.bind('<Button-1>',action)

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

    Il faut explorer les différentes approches et choisir celle qui vous plait/paraît la plus adaptée à ce que vous voulez.

    Pour ce qui est de la méthode find_overlapping je n'ai pas compris comment cela s'utilise ou plutôt à quoi correspondent les (x1,x2,y1,y2)
    (x1,x2,y1,y2) définissent un rectangle qui peut être réduit à un point.
    La fonction retourne les items qui chevauchent le "rectangle".

    Mais mon souci est qu'il faudrait que la fonction qui change la couleur sur clic de la souris ne marche que sur un certain nombre de carré, par exemple que sur les 3 premiers et pas sur n'importe quel carré.
    Ca veut dire identifier les carrés qui... et tester que c'est un de ces carrés avant de...
    Pour identifier, vous avez toujours la liste de départ et aussi la possibilité d'associer un tag au carrés en question et de fair un bind sur ce tag.

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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/11/2012, 14h11
  2. Double conditions pour verrouiller une action
    Par ThSPB dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/02/2011, 12h14
  3. effectuer une action pour une liste de repertoire
    Par Samb95 dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2010, 16h25
  4. Réponses: 9
    Dernier message: 23/06/2008, 15h54
  5. Condition avant d'effectuer une action
    Par mali_67 dans le forum Langage
    Réponses: 12
    Dernier message: 04/03/2008, 12h05

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