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 :

Problème de capture et utilisation de clic (event) de souris


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de capture et utilisation de clic (event) de souris
    Bonjour,
    Dans mon projet, il faut remplir une grille de bataille navale.
    Je veux donc enregistrer la position en cliquant sur un canvas (grille de jeu) puis traiter cette coordonnée (chaîne de caractères ex B3) dans le programme pour construire un bateau ou faire un tir.
    J'ai essayé plusieurs solutions ( passer par une class, variables globales...) et j'arrive à construire un premier bateau mais le programme ne ressort pas de la boucle du event.

    Vous aurez compris que je débute en Python donc désolé si mes propos ne sont pas très clair et je vous remercie d'avance pour vos réponses.

    Mon programme:
    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
     
    from tkinter import *
     
    ordonnees=['A','B','C','D','E','F','G','H','I','J']
    abscisses=['1','2','3','4','5','6','7','8','9','10']
     
     
    fen = Tk()
    fen.title('Joueur1')
     
    message = Label(fen, text='Bataille navale')
    message.grid(row = 0, column = 0, columnspan=2, padx=3, pady=3, sticky = W+E)
     
     
    bouton_quitter = Button(fen, text='Quitter', command = fen.destroy)
    bouton_quitter.grid(row = 2, column = 1, padx = 3, pady = 3, sticky = S+W+E)
     
    bouton_reload = Button(fen, text='Recommencer')
    bouton_reload.grid(row = 2, column = 0, padx = 3, pady = 3, sticky = S+W+E)
     
     
    dessin = Canvas(fen, bg="blue", width=601, height=601)
    dessin.grid(row = 1, column = 0, columnspan = 2, padx = 5, pady = 5)
     
    lignes = []
    for i in range(13):
        lignes.append(dessin.create_line(0, 50*i+2, 603, 50*i+2, width=3))
        lignes.append(dessin.create_line(50*i+2, 0, 50*i+2, 603, width=3))
     
     
     
    for i in range(10):      # lettres et chiffres de la grille
        case = dessin.create_text(25, 50*i+75, text=ordonnees[i], font="Arial 16", fill="black")
        case = dessin.create_text(575, 50*i+75, text=ordonnees[i], font="Arial 16", fill="black")
        case = dessin.create_text(50*i+75, 25, text=abscisses[i], font="Arial 16", fill="black")
        case = dessin.create_text(50*i+75, 575, text=abscisses[i], font="Arial 16", fill="black")
     
    cases = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],       # Tableau
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
     
    ## Fonction bateau
    bateaux=[4,3,3,2,2,2,1,1,1,1]
    u = int(0)
     
    def posBat(event) :      # construction de la flotte
        global b
        u = int(0)
        T = int(0)
        if u < 10 :
            b = bateaux[u]       
            message.configure(text='Clic sur la position du bateau à {} cases:'.format(bateaux[u]))
            dessin.bind('<Button-1>', position)
            u+=1
     
    def position(event) :      # clic position
        """ Entrées : Un événement de la souris
        Sortie : Affiche en temps réel les coordonnées de la souris dans la zone de texte"""
        global l,P,c
        abscisse = event.x
        ordonnee = event.y
        l = (ordonnee-2)//50                  # Ligne du clic
        P = ordonnees[l-1]
        c = (abscisse-2)//50                  # Colonne du clic
        for j in range(2):
            for k in range(2):       # vérification de l'absence de voisins au clic
                if cases[l-1+j][c-1+k] == 1:
                    message.configure(text='Clic sur la position du bateau à {} cases:'.format(bateaux[u]))
                    dessin.bind('<Button-1>', position)
                else :       # vérification de l'absence de voisins au clic
                    case = dessin.create_rectangle(50*c, 50*l, 50*c+50, 50*l+50, fill='grey')
                    case = dessin.create_text(50*c+25, 50*l+25, text=b, font="Arial 16", fill="white" )
                    message.configure(text='Cliquer à droite ou en dessous de ( {} ; {} )'.format(P, c))
                    dessin.bind('<Button-1>', dirBat)
     
     
    def dirBat(event) :      # choix vertical ou horizontal
        global l1,P1,c1,u
        abscisse = event.x
        ordonnee = event.y
        l1 = (ordonnee-2)//50                  
        P1 = ordonnees[l1-1]
        c1 = (abscisse-2)//50
        T = int(0)
     
        ''' message.configure(text='Cliquer à droite ou en dessous de ( {} ; {} )'.format(P, c)) '''
        if c1 != c and l1 == l:  # navire horizontal
            for n in range(b):
                for j in range(2):       # vérification de l'absence de voisins horizontaux
                    if cases[l-1+j][c+1+n] == 1:
                        message.configure(text='Clic sur la position du bateau à {} cases:'.format(bateaux[u]))
                        dessin.bind('<Button-1>', position)
                    else:
                        cases[l][c+n] = 1
                        T += 1
                        case = dessin.create_rectangle(50*(c+n), 50*l, 50*(c+n)+50, 50*l+50, fill='grey')
                        case = dessin.create_text(50*(c+n)+25, 50*l+25, text=b, font="Arial 16", fill="white")
     
        if c1 == c and l1 != l:  # navire vertical
            for n in range(b):
                for j in range(2):       # vérification de l'absence de voisins verticaux
                    if cases[l+1+n][c-1+j] == 1:
                        message.configure(text='Clic sur la position du bateau à {} cases:'.format(bateaux[u]))
                        dessin.bind('<Button-1>', position)
                    else:
                        cases[l+n][c] = 1
                        T += 1
                        case = dessin.create_rectangle(50*c, 50*(l+n), 50*c+50, 50*(l+n)+50, fill='grey')
                        case = dessin.create_text(50*c+25, 50*(l+n)+25, text=b, font="Arial 16", fill="white")
     
     
        print(b)
        print(cases)
     
     
     
    ##----- Programme principal -----##
     
    message.configure(text='Clic pour démarrer :')
    dessin.bind('<Button-1>', posBat)
    fen.mainloop()                      # Boucle d'attente des événements

  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 776
    Points
    36 776
    Par défaut
    Citation Envoyé par gdsteph Voir le message
    et j'arrive à construire un premier bateau mais le programme ne ressort pas de la boucle du event.
    Si vous changez l'action/callback à chaque itération/évènement difficile de maîtriser la séquence des opérations qui leur seront associées. Il serait plus simple d'organiser les interactions avec l'utilisateur avec des Bouton(créer bateau) puis entrer alors dans une séquence qui saisisse la position du bateau ou sorte en abandon.

    Citation Envoyé par gdsteph Voir le message
    Vous aurez compris que je débute en Python donc désolé si mes propos ne sont pas très clair et je vous remercie d'avance pour vos réponses.
    Si vous vous lancez dans la construction d'une interface graphique, vous n'êtes plus vraiment un débutant (en tous cas, il y a des tas de choses à maîtriser avant pour ne pas se prendre les pieds dans le tapis).
    Ceci dit, ici votre problème est plutôt côté "design" i.e. organiser la séquence d'actions attendues côté utilisateur histoire de maîtriser ce qu'il va se passer côté code à écrire. On peut faire çà avec une suite de "clics" mais çà demande d'écrire un automate à état finis (et çà ne transpire pas du tout dans le code que vous avez posté). Sinon, il faut faire plus simple.

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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous changez l'action/callback à chaque itération/évènement difficile de maîtriser la séquence des opérations qui leur seront associées. Il serait plus simple d'organiser les interactions avec l'utilisateur avec des Bouton(créer bateau) puis entrer alors dans une séquence qui saisisse la position du bateau ou sorte en abandon.
    Je n'ai pas été très clair: Je voudrais capturer la position d'un click sur un canvas + utiliser ses coordonnées dans le programme source.

  4. #4
    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 776
    Points
    36 776
    Par défaut
    Citation Envoyé par gdsteph Voir le message
    Je n'ai pas été très clair: Je voudrais capturer la position d'un click sur un canvas + utiliser ses coordonnées dans le programme source.
    Il suffit de la récupérer dans le "event" que vous avez mis en paramètre de vos callbacks.

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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Il suffit de la récupérer dans le "event" que vous avez mis en paramètre de vos callbacks.

    - W
    Désolé, je ne comprends pas les termes que vous employez.

    Pourriez-vous me donner des exemples de code correspondant?

    Suite aux discussions précédentes, je voudrais savoir comment:
    - créer un bouton qui enregistrerait la position(provenant d'un event sur le canvas) affichée dans le Label message
    - utiliser cette position dans le programme source.

  6. #6
    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 776
    Points
    36 776
    Par défaut
    Citation Envoyé par gdsteph Voir le message
    Pourriez-vous me donner des exemples de code correspondant?
    Quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
     
    root = tk.Tk()
     
    def callback(event):
        print(event.x, event.y)
     
    root.bind('<1>', callback)
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/04/2007, 10h08
  2. [VBA-E]problème de récupération de variables et d'event
    Par zenix dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/04/2006, 12h53
  3. Réponses: 1
    Dernier message: 05/04/2006, 14h22
  4. problème de capture son avec Directshow
    Par albator83 dans le forum DirectX
    Réponses: 2
    Dernier message: 06/11/2003, 17h18

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