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 avec Grid_location() dans Frame


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    france
    Inscrit en
    Juillet 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : france

    Informations forums :
    Inscription : Juillet 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Problème avec Grid_location() dans Frame
    Bonjour,

    Je débute en python.

    mon soucie concerne Grid_location(), hormis avec self.window ou je n'ai pas erreur, mais des que j'essaye de pointer une frame précise dans self, j ai une erreur.
    je n'utilise que .grid pour le positionnement dans toutes les Frame

    Code qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def click(self,event):
     
            x = self.window.winfo_rootx()
            y = self.window.winfo_rooty()
            z = self.window.grid_location(x, y)
            messagebox.showinfo(z)
    Mon but final est de pointer sur une frame qui se trouve dans un ttk.notebook
    Self.window > Frame1 > Notebook > frame2

    merci d'avance pour votre aide

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

    Citation Envoyé par lancel0t Voir le message
    mon soucie concerne Grid_location(), hormis avec self.window ou je n'ai pas erreur, mais des que j'essaye de pointer une frame précise dans self, j ai une erreur.
    .grid_location va retourner les indices row/column de la grille correspondant à (x, y).
    Après pour passer de la au widget correspondant, il y a encore des indirections à faire.

    Citation Envoyé par lancel0t Voir le message
    Mon but final est de pointer sur une frame qui se trouve dans un ttk.notebook Self.window > Frame1 > Notebook > frame2
    pointer? je ne comprends pas trop ce que çà veut dire puisqu'à priori vous cliquez pour déclencher un event qui devrait récupérer le widget correspondant dans event.widget.

    - W

  3. #3
    Candidat au Club
    Homme Profil pro
    france
    Inscrit en
    Juillet 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : france

    Informations forums :
    Inscription : Juillet 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci pour ce retour rapide wiztricks

    Quand je dis pointer,

    je cherche a récupérer les informations qui se trouve sur la Frame2 dans mon exemple d'arborescence du premier post

    dans mon application , f1 c est ma Frame2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def click(self,event):
     
            x = self.f1.winfo_rootx()
            y = self.f1.winfo_rooty()
            z = self.f1.grid_location(x, y)
            messagebox.showinfo(z)


    mon erreur :

    x = self.f1.winfo_rootx()
    AttributeError: 'Fullscreen_Example' object has no attribute 'f1'
    Fullscreen_Example etant ma Class

    vous parlez d'indirection, auriez vous un exemple concret ?

    merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    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 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par lancel0t Voir le message
    mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = self.f1.winfo_rootx()
    AttributeError: 'Fullscreen_Example' object has no attribute 'f1'
    L'erreur dit juste que l'attribut f1 n'existe pas.
    Ce qu'on sait normalement gérer lorsqu'on programme avec les classes.

    Citation Envoyé par lancel0t Voir le message
    vous parlez d'indirection, auriez vous un exemple concret ?
    Après avoir récupérer row, column, vous pouvez récupérer le widget correspondant avec .grid_slaves.

    Pour le reste, lorsque vous expliquerez ce que vous cherchez à faire avec un petit exemple qui montre comment vous avez essayé de le réaliser, je pourrais peut être comprendre comment vous aider...

    - W

  5. #5
    Candidat au Club
    Homme Profil pro
    france
    Inscrit en
    Juillet 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : france

    Informations forums :
    Inscription : Juillet 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    L'erreur dit juste que l'attribut f1 n'existe pas.
    Ce qu'on sait normalement gérer lorsqu'on programme avec les classes.



    Après avoir récupérer row, column, vous pouvez récupérer le widget correspondant avec .grid_slaves.

    Pour le reste, lorsque vous expliquerez ce que vous cherchez à faire avec un petit exemple qui montre comment vous avez essayé de le réaliser, je pourrais peut être comprendre comment vous aider...

    - W
    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
    44
    45
    46
    47
    48
    49
    50
    51
    from tkinter import *
    import tkinter as tk
    from tkinter import ttk
    from tkinter import messagebox
     
     
     
     
     
    class Exemple:
        def __init__(self):
     
            self.window = tk.Tk()
            self.window.bind("<Button-1>", self.click)
            self.console()
            self.window.mainloop()
     
        def click(self,event):
     
            x = self.f1.winfo_rootx()
            y = self.f1.winfo_rooty()
            z = self.f1.grid_location(x, y)
            messagebox.showinfo(z)
     
     
     
     
        def console(self):
            #Fichier_etalonnage_serveau = open("configuration.txt", "r")
     
            Frame_Calibration = Frame(self.window, borderwidth=2)
            Frame_Calibration .grid(row=0,column=0)
     
            style = ttk.Style(Frame_Calibration)
            style.configure("lefttab.TNotebook", tabposition="nw", background='blue', foreground='green')
            notebook = ttk.Notebook(Frame_Calibration, style="lefttab.TNotebook")
            f1 = Frame(notebook,  width=200, height=200) #, bg='light grey')
            f2 = Frame(notebook, width=200, height=200)  #, bg='light grey')
            notebook.add(f1, text="Frame 1")
            notebook.add(f2, text="Frame 2")
            notebook.grid(row=0, column=0, sticky="nw")
     
            canvas_serveau_titre = Canvas(f1,height=13 ,background='light grey')
            txt = canvas_serveau_titre.create_text(5, 2, text="Case 1", font="Arial 8", fill="black", anchor='nw')
            canvas_serveau_titre.grid(sticky="W", row=0, column=0)
     
            canvas_serveau_titre = Canvas(f1,height=13 ,width="42",background='light grey')
            txt = canvas_serveau_titre.create_text(7, 2, text= "Case 2", font="Arial 8", fill="black", anchor='nw')
            canvas_serveau_titre.grid( row=0, column=2)
     
    Exemple()
    je veux récupérer les emplacement de la case 1 et de la case 2 en cliquant dessus.

    juste par hazard, j arrive pas a retirer le quadrillage qui entour mes case, une idée ?

    merci

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

    Ligne 37, écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.f1 = f1 = Frame(notebook,  width=200, height=200) #, bg='light grey')
    Pour le reste, tkinter et les classes sont abordés dans les tutos avec des exercices corrigés.

    - W

  7. #7
    Candidat au Club
    Homme Profil pro
    france
    Inscrit en
    Juillet 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : france

    Informations forums :
    Inscription : Juillet 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ligne 37, écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.f1 = f1 = Frame(notebook,  width=200, height=200) #, bg='light grey')
    - W
    merci, ca avance, plus d erreur

    ci dessous mon code mis a jour avec le rajout d une bouche pour afficher plusieurs lignes de Canvas.

    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
    from tkinter import *
    import tkinter as tk
    from tkinter import ttk
    from tkinter import messagebox
     
     
     
     
     
    class Exemple:
        def __init__(self):
     
            self.window = tk.Tk()
            self.window.bind("<Button-1>", self.click)
            self.console()
            self.window.mainloop()
     
        def click(self,event):
     
            x = self.f1.winfo_rootx()
            y = self.f1.winfo_rooty()
            z = self.f1.grid_location(x, y)
            messagebox.showinfo(z)
     
     
     
     
        def console(self):
            #Fichier_etalonnage_serveau = open("configuration.txt", "r")
     
            Frame_Calibration = Frame(self.window, borderwidth=2)
            Frame_Calibration .grid(row=0,column=0)
     
            style = ttk.Style(Frame_Calibration)
            style.configure("lefttab.TNotebook", tabposition="nw", background='blue', foreground='green')
            notebook = ttk.Notebook(Frame_Calibration, style="lefttab.TNotebook")
            self.f1 = f1 = Frame(notebook,  width=200, height=200) #, bg='light grey')
            self.f2 = f2 = Frame(notebook, width=200, height=200)  #, bg='light grey')
            notebook.add(f1, text="Frame 1")
            notebook.add(f2, text="Frame 2")
            notebook.grid(row=0, column=0, sticky="nw")
     
            i = 0
     
            while i < 7:
     
                canvas_serveau_titre_1 = Canvas(f1,height=13 ,background='light grey')
                canvas_serveau_titre_1.create_text(5, 2, text= 'row = ' + str(i) + ' column = 0', font="Arial 8", fill="black", anchor='nw')
                canvas_serveau_titre_1.grid(sticky="W", row=i, column=0)
     
                canvas_serveau_titre_2 = Canvas(f1,height=13 ,background='light grey')
                canvas_serveau_titre_2.create_text(5, 2, text="Case 2", font="Arial 8", fill="black", anchor='nw')
                canvas_serveau_titre_2.grid(sticky="W", row=i, column=1)
     
                i = i+1
     
    Exemple()
    J ai du mal a comprendre pourquoi j ai toujours le même résultat dans le grid_location : 0 7 et pas l'emplacement ou je clique ? (le 7 variant en fonction du nombre de boucle de while)

    pourquoi j ai aussi le message box qui apparait en cliquant en dehors de la zone de la frame f1 ?

    merci de prendre le temps de m aider

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    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 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par lancel0t Voir le message
    J ai du mal a comprendre pourquoi j ai toujours le même résultat dans le grid_location : 0 7 et pas l'emplacement ou je clique ? (le 7 variant en fonction du nombre de boucle de while)
    Et moi je ne comprends pas pourquoi vous voulez que la position de la fenêtre change lorsqu'on clique quelque part...

    - W

  9. #9
    Candidat au Club
    Homme Profil pro
    france
    Inscrit en
    Juillet 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : france

    Informations forums :
    Inscription : Juillet 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et moi je ne comprends pas pourquoi vous voulez que la position de la fenêtre change lorsqu'on clique quelque part...

    - W
    je n ai jamais fais une telle demande je crois

    je veux juste que soit afficher dans mon pop up l'emplacement d'un Canvas génère par ma boucle qui se trouve dans la frame f1 quand je clic dessus.

    je ne veux pas générer de popup quand je clic ailleurs que dans la frame f1


    merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    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 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Citation Envoyé par lancel0t Voir le message
    je veux juste que soit afficher dans mon pop up l'emplacement d'un Canvas génère par ma boucle qui se trouve dans la frame f1 quand je clic dessus.
    mouais... ben ce n'est pas ce que votre code fait.
    A la base programmer, c'est juste reformuler ce qu'on veut "programmatiquement", histoire de coder quelque chose qui va le faire. Ce qui suppose un minimum de maîtrise des outils utilisés...

    Dans votre cas, une frame qui affiche quelques labels pour voir ce qu'on peut faire avec grid_location... serait un bon début pour voir comment çà marche et ce qu'on peut faire avec.

    Après c'est vous qui voyez.

    - W

  11. #11
    Candidat au Club
    Homme Profil pro
    france
    Inscrit en
    Juillet 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : france

    Informations forums :
    Inscription : Juillet 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par lancel0t Voir le message


    juste par hazard, j arrive pas a retirer le quadrillage qui entour mes case, une idée ?

    merci
    j ai trouvé

    a rajouter dans votre déclaration de label qui sera dans la grid()

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    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 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Et pour les autres, un petit exemple pour jouer à récupérer le widget sur lequel on a cliqué:

    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
    import tkinter as tk
     
    root = tk.Tk()
     
    frame = tk.Frame(root)
    for i in range(5):
        for j in range(5):
            tk.Label(frame, text=f'({i}, {j})', width=8, height=3, relief='groove',
                     ).grid(
                row=j, column=i)
    frame.pack()
     
    def on_click(e):
        w = e.widget
        print(w['text'])
     
        x = e.x_root - frame.winfo_rootx()
        y = e.y_root - frame.winfo_rooty()    
        print(frame.grid_location(x, y))
     
    root.bind('<1>', on_click)
     
    tk.mainloop()
    montrant comment on récupère ses coordonnées dans la grid (pour autant que çà serve à quelque chose).

    - W

Discussions similaires

  1. Problème avec image dans JPanel
    Par littleshrimp dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/05/2006, 14h05
  2. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  3. Problème avec Between dans un code
    Par Sendo dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 18h44
  4. problème avec graphique dans état access
    Par petitmic dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 14h55
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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