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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 762
    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 762
    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 : 236
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 : 228
Taille : 244,9 Ko

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

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, 19h20
  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, 18h12
  3. Réponses: 3
    Dernier message: 18/02/2010, 17h49
  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, 13h37
  5. Détection d'entré de la souris
    Par soad dans le forum 2D
    Réponses: 6
    Dernier message: 10/02/2007, 21h35

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