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 :

Récupérer le "size" d'un item create_text


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai Avatar de Falenn
    Femme Profil pro
    Prise de tête
    Inscrit en
    Mars 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Prise de tête

    Informations forums :
    Inscription : Mars 2021
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Récupérer le "size" d'un item create_text
    Bonjour,

    Je cherche sans trouver. Ca m'agace vraiment.
    Dans un "canvas", j'ai créé plusieurs objets "text" de différentes tailles et je voudrais récupérer chacune d'entre elles.
    J'y arrive pô. Message d'erreur ..

    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
     
    import tkinter as tk
    from tkinter import *
    import tkinter.font as tkFont
     
    root = Tk()
    cnv = Canvas(root)
    cnv.pack()
     
    # textes de différentes tailles
    cnv.create_text(200, 50, font=tkFont.Font(family="Arial", size=10), text="blabla")
    cnv.create_text(200,100, font=tkFont.Font(family="Arial", size=15), text="blibli")
    cnv.create_text(200,150, font=tkFont.Font(family="Arial", size=20), text="bloblo")
    cnv.create_text(200,200, font=tkFont.Font(family="Arial", size=25), text="blublu")
     
    # récupérer la taille de chaque item "text"
    lst = cnv.find("all")
    n = 0
    while n < len(lst) :
        obj = lst[n]
        police = cnv.itemcget(obj,"font")
        print (police) # mouais ... tk a créé des font1, font2, etc ...
        taille = police.cget("size") # OUPS ! AttributeError: 'str' object has no attribute 'cget'
        print (taille)
        n = n+1
     
    root.mainloop()

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

    Les dimensions d'un item sont retournées par .bbox appliqué à l'item.
    Si vous voulez récupérer la taille d'une police de caractères, il faut créer un dictionnaire où la clef sera l'identifant de la police associé à l'objet police histoire d'appliquer .cget('size') au bon objet.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f = tkFont.Font(family="Arial", size=10)
    print(str(f), f.cget('size'))
    - W

  3. #3
    Membre à l'essai Avatar de Falenn
    Femme Profil pro
    Prise de tête
    Inscrit en
    Mars 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Prise de tête

    Informations forums :
    Inscription : Mars 2021
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Non, il ne s'agit pas des dimensions de l'objet mais des caractéristiques de la police utilisée (j'aurais pu demander le nom de la famille de police, son soulignement, etc ...).
    Je ne connais pas les dictionnaires.

    J'avais la naïveté de croire que tkFont.Font créait des listes de polices aux attributs récupérables.
    Enfin, c'est surtout le nom de police qui ne l'est pas. J'ai essayé de le mettre en tag de l'objet "text", mais ça ne marche pas non plus (TK considère qu'il s'agit d'un string et pas du nom de tkFont.Font).

    J'en suis arrivé à une solution bricolée : créer une liste des caractéristiques des objets "text" (liste complémentaire à itemconfigure)
    lst_txt ([id, "famille", hauteur, "gras", "italic", ...])
    et, à chaque modification de l'objet "text", recréer une police tkFont.Font.

    Merci W.

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

    Citation Envoyé par Falenn Voir le message
    J'ai essayé de le mettre en tag de l'objet "text", mais ça ne marche pas non plus (TK considère qu'il s'agit d'un string et pas du nom de tkFont.Font).
    Vous pouvez toujours demander à tkinter de récupérer l'objet "font" à partir du nom que vous avez récupéré: tkinter.font.nametofont est là pour çà.

    - W

  5. #5
    Membre à l'essai Avatar de Falenn
    Femme Profil pro
    Prise de tête
    Inscrit en
    Mars 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Prise de tête

    Informations forums :
    Inscription : Mars 2021
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Vous pouvez toujours demander à tkinter de récupérer l'objet "font" à partir du nom que vous avez récupéré: tkinter.font.nametofont est là pour çà.
    - W
    A partir du pseudo-nom créé par TK (font1, font2, etc ...), ça ne marche pas :
    "named font %s does not already exist" % (self.name,))
    _tkinter.TclError: named font font1 does not already exist

    C'est surprenant; puisqu'il mémorise le contenu de "tkFont.Font" sans qu'on est besoin de le nommer, il est donc capable de retrouver ces paramètres sans passer par un nom de police.

    Si on associe à chaque objet texte une police nommée, ça marche.
    Mais, ce système serait très lourd :
    . vérifier les polices similaires existantes ou créer autant de polices que d'objets texte
    . indexer les polices pour les nommer
    . faire un tag du nom dans l'objet texte ou créer une liste d'items avec ces noms (id, nom police)

    J'avais déjà créé une liste des items avec des attributs. Je n'ai eu qu'à ajouter les 6 options de "font" que j'utilise.

Discussions similaires

  1. Récupérer le contenu d'une variable quotée
    Par wayat91 dans le forum VBScript
    Réponses: 3
    Dernier message: 04/03/2011, 11h01
  2. Réponses: 6
    Dernier message: 08/08/2006, 09h14

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