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

Python Discussion :

décalage entre coordonnées de souris et coordonnées canvas tkinter


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut décalage entre coordonnées de souris et coordonnées canvas tkinter
    Bonjour,

    J'ai un problème de décalage de coordonnées entre la souris et le canvas...
    Dans le code ci-dessous, je crée un quadrillage dans un canvas qui commence à x=30 et y=30.
    mais lorsque je place la souris à x=30 et y=30, la souris est légèrement décalé, du coup lorsque je clique pour noircir une case, ce n'est pas forcément la bonne qui se noircit...
    Si on clique sur create grid au démarrage, il n'y a pas de problème, mais si on clique ensuite sur matrice, ça se décale...
    De plus, je ne comprends pas pourquoi il reste des spinbox affichés alors qu'ils sont censés être effacés par le .delete("all").
    y-a-t-il une erreur dans mon code, ou est-ce un bug de mon ordi (je travaille sur un macbook air M2) ?

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Thu Feb  1 23:04:57 2024
     
    @author: jojo
    """
    import tkinter as tk
    from tkinter import ttk
     
     
    root = tk.Tk()
    btn_frame = tk.Frame(root)
    btn_frame.grid(row=0, column=0, columnspan=3)
    grille_frame = tk.Canvas(root, width=600, height=600)
    grille_frame.grid(row=1, column = 0)
    yscrollbar_grille = ttk.Scrollbar(root, orient="vertical", command=grille_frame.yview)
    yscrollbar_grille.grid(row=0, column=3, rowspan=3, sticky="ns")
    xscrollbar_grille = ttk.Scrollbar(root, orient="horizontal", command=grille_frame.xview)
    xscrollbar_grille.grid(row=2, column=0, columnspan=3, sticky="ew")
    grille_frame.config(yscrollcommand=yscrollbar_grille.set, xscrollcommand=xscrollbar_grille.set)
    rows = 12
    cols = 12
    cell_size = 40
     
    x = 30
    y = 30
     
    def zoom():
        grille_frame.scale("all", 30, 30, 0.5, 0.5)
     
    scale_btn = tk.Button(btn_frame, text="scale", command=zoom)
    scale_btn.grid(row=0, column=0)
     
    def mouse_position(event):
        grille_frame.event_generate("<Motion>", warp=True, x=30, y=30)
        print("mouse position winfo", root.winfo_pointerxy())
        print("mouse position on canvas", event.x, event.y)
        print("mouse postition on screen", event.x_root, event.y_root)
        print("canvas postition", grille_frame.bbox("all"))
     
     
    root.bind("<Key>", mouse_position)
    def matrice():
        grille_frame.delete("all")
        y = 30
        for r in range(rows):
            x = 30
     
            spinbox_row = tk.Spinbox(grille_frame, from_=0, to=cols, width=2)
            grille_frame.create_window((x, y+cell_size/2), window=spinbox_row, anchor="e")
     
            temp = []
            for c in range(cols):
                cell = grille_frame.create_rectangle((x, y), (x + cell_size, y + cell_size), fill="white", outline= "black")
                temp.append(cell)
                x = x + cell_size
            y = y + cell_size
     
        x = y = 30
        for c in range(cols):
            spinbox_col = tk.Spinbox(grille_frame, from_=0, to=rows, width=2)
            grille_frame.create_window((x+cell_size/2, y), window=spinbox_col, anchor="s")
            x = x + cell_size
     
        grille_frame.update_idletasks()
        grille_frame.config(scrollregion=grille_frame.bbox("all"))
     
    matrice_btn = tk.Button(btn_frame, text="Matrice", command=matrice)
    matrice_btn.grid(row=0, column=2)
    def creer_hanjie():
        """ affiche une grille de cases blanches """
        grille_frame.delete("all")
        x = 30
        y = 30
     
        for r in range(rows):
            x = 30
            for c in range(cols):
                cell = grille_frame.create_rectangle((x, y), (x + cell_size, y + cell_size ), fill="white", outline= "black")
                x = x + cell_size
                #print("coordonnées case:", grille_frame.coords(cell))           
            y = y + cell_size
        root.bind("<Button-1>", click_1case)
     
        grille_frame.update_idletasks()
        print("canvaas taille", grille_frame.bbox("all"))
        grille_frame.config(scrollregion=grille_frame.bbox("all"))
     
    grille_btn = tk.Button(btn_frame, text="create grid", command=creer_hanjie)
    grille_btn.grid(row=0, column=1)
     
    def click_1case(event):
        """ change la couleur de la case par click simple, 1 case à la fois """
        print("clic souris", event.x, event.y)
        case = grille_frame.find_closest(event.x, event.y)
        couleur_actuelle = grille_frame.itemcget(case, "fill")
        if couleur_actuelle == "white":
            nouvelle_couleur = "black"
        else:
            nouvelle_couleur = "white"
        grille_frame.itemconfigure(case, fill=nouvelle_couleur)
     
    root.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Je n'ai peut être pas compris les problèmes décrits, mais je ne reproduis rien de flagrant côté décalage entre clic de souris et carreau noir que ça dessine... et les spinbox créées par matrice sont bien effacées lorsqu'on les efface (i.e. pas lorsqu'on clique sur scale après).

    Reste qu'il y a quand même des soucis avec tkinter sur OSX en fonction de la mouture/version de python/TCLTK utilisée, voir la documentation: s'assurer qu'on a de bonnes versions avant de s'inquiéter plus.

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

  3. #3
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    comme une image vaut mieux qu'un long discours, voici ce que j'obtiens en cliquant d'abord sur matrice et ensuite sur create grid :

    Nom : Capture d’écran 2024-02-02 à 16.21.38.png
Affichages : 244
Taille : 245,0 Ko

    et ici, j'ai cliqué juste au dessus de la case, et elle s'est noircie :

    Nom : Capture d’écran 2024-02-02 à 16.22.50.png
Affichages : 234
Taille : 244,9 Ko

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Même manip de mon côté!
    Nom : Capture d'écran 2024-02-02 170535.png
Affichages : 223
Taille : 36,6 Ko
    puis clic sur les 4 carrés de la diagonale:
    Nom : Capture d'écran 2024-02-02 172030.png
Affichages : 222
Taille : 18,1 Ko

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

  5. #5
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    ok merci, donc il s'agit certainement d'un problème lié à mon ordi

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Vérifiez que vous utilisez une version décente de TCL/Tk sur OSX en suivant les recommandations données à l'URL: https://www.python.org/download/mac/tcltk/

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

  7. #7
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    J'ai la version 8.6.12 de tk et python 3.11.5, et j'utilise spyder comme IDE.
    J'ai l'impression que c'est la dernière version

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Si vous avez lu le document mentionné, la dernière version ne semble pas suffire.
    De toutes façons, le comportement que j'ai chez qui correspond au code qui a été écrit alors que chez vous c'est plus inventif. Donc il y a "bug"... et si vous êtes sûr de votre coup côté versions, il faut aller voir dans les buglist de python.org pour voir si cela a été reporté.

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

  9. #9
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    Finalement en faisant cette modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x, y = grille_frame.canvasx(event.x), grille_frame.canvasy(event.y)
    print("clic souris", event.x, event.y, x, y)
    case = grille_frame.find_closest(x, y)
    à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case = grille_frame.find_closest(event.x, event.y)
    dans la fonction click_1case cela corrige le bug de décalage de la souris.
    Par contre il reste toujours la spinbox non effacé.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Citation Envoyé par jojomonk Voir le message
    dans la fonction click_1case cela corrige le bug de décalage de la souris.
    J'ai essayé de comprendre pourquoi je ne reproduis pas le problème: vous décalez la région affichée de +30, +30 et aussi les cases.
    Du coup, event.x|y et canvasx|y retournent les mêmes valeurs et il n'y a pas de décalage.

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

  11. #11
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    chez moi, event.x et event.y ne retourne pas les mêmes valeurs que Canvasx et Canvasy, j'ai un décalage de 16 en x et de 1 en y

  12. #12
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 253
    Par défaut
    Hello,
    je ne sais pas si cela existe sous Mac mais utilises tu une mise à l'échelle personnalisée (par exemple 125% au lieu de 100%) pour zoomer l'affichage si l'écran est petit par rapport à sa résolution et que tu n'as pas une très bonne vue.
    [EDIT] sous Windows avec mise à l'échelle de 125% , il n'y a pas de décalage.
    Ami calmant, J.P

  13. #13
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    Non, je n'utilise pas de mise à l'échelle.

Discussions similaires

  1. Position réelle de la souris sur un Canvas "scrollé"
    Par M.Dlb dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/01/2014, 20h20
  2. La position de la souris dans un canvas
    Par Masmeta dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 25/10/2013, 19h12
  3. Réponses: 3
    Dernier message: 18/02/2010, 18h49
  4. Event sur le déplacement de la souris dans un canvas
    Par Stéphane Nadry dans le forum Tkinter
    Réponses: 2
    Dernier message: 27/10/2008, 14h37
  5. Détection d'entré de la souris
    Par soad dans le forum 2D
    Réponses: 6
    Dernier message: 10/02/2007, 22h35

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