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 :

[tkinter] méthode tag_ranges du widget Text [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Physique et chimie depuis 1983 mais Langage Python depuis juin 2021
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Physique et chimie depuis 1983 mais Langage Python depuis juin 2021
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 14
    Points
    14
    Par défaut [tkinter] méthode tag_ranges du widget Text
    Bonjour,
    pour planter le décor, je suis débutant avec Python (3 mois), mon objectif principal est d'enregistrer les positions associées aux différentes balises (tags) d'un widget Text vers un fichier de sauvegarde pour pouvoir restituer le texte et ses balises par la suite (avec une préférence pour sqlite3 pour la sauvegarde).

    Dans ce but, j'ai testé la méthode tag_names (pour récupérer les noms des balises) et la méthode tag_ranges (pour récupérer les positions des balises). Je rencontre une difficulté sérieuse avec la méthode tag_ranges car l'objet qu'elle retourne me paraît un peu bizarre : la doc nous dit qu'il s'agit d'une liste mais on trouve qu'il s'agit d'un tuple quand on vérifie avec la méthode type.

    Pour enregistrer les données dans sqlite3, je dois certainement les encoder en string mais c'est là que ça coince, voici un exemple simple pour éviter de noyer le poisson :

    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
    import tkinter as tk
    import json 
     
    def Linked(tup):
        for tag in tup:
            widText.tag_config(tag, foreground="blue", underline=1)
            widText.tag_bind(tag, "<Enter>", lambda e: widText.config(cursor="hand2"))
            widText.tag_bind(tag, "<Leave>", lambda e: widText.config(cursor=""))
     
     
    def listerTags():
            # rechercher les noms de tous les tags(= balises) dans le texte
            listTags = widText.tag_names()   # Sans argument, on obtient la liste (ou plutôt le tuple) de tous les tags définis pour le widget Text appelant.
     
            # rechercher les zones du texte où chacun des tags est utilisé
            for strTag in listTags:
                if strTag != "sel":     # j'élimine les infos pour le tag sel qui ne m'intéresse pas
                    zones = widText.tag_ranges(strTag)
                    print("pour la balise {}, il y a les intervalles : {}\n".format(strTag , zones))                
                    #print("en JSON :\n" , json.dumps(zones), "\n")     # décoché car erreur
     
     
    root = tk.Tk()
    root.title("tkinter.Text : méthodes tag_names et tag_ranges")
    root.geometry("600x500+300+200")
     
    widText = tk.Text(root, width=40)   # attention car width se mesure en nb de caractères !
    bt1 = tk.Button(root, text="infos Tags", command=listerTags)
    bt2 = tk.Button(root, text="Quitter", command=root.destroy)
     
    bt1.grid(row =1, column =1, padx =10)
    bt2.grid(row =2, column =1, padx =10)
    widText.grid(row =1, column =0, rowspan =2, padx =10, pady =5)
     
     
    widText.insert(tk.END, "balise 1\n", "tag1")
    for v in range(10):
        widText.insert(tk.END, "bla bla..... bla bla..... \n")
    widText.insert(tk.END, "balise 2\n", "tag2")
    for v in range(10):
        widText.insert(tk.END, "bla bla..... bla bla..... \n")
     
    Linked(("tag1", "tag2"))
     
    root.mainloop()

    Résultat obtenu dans la console :

    • pour la balise tag1, il y a les intervalles : (<string object: '1.0'>, <string object: '2.0'>)
    • pour la balise tag2, il y a les intervalles : (<string object: '12.0'>, <string object: '13.0'>)


    Question :
    Les noms des balises apparaissent sans leur type(ce qui m'arrange) mais pourquoi les intervalles (=ranges) comportent des ajouts comme <string object: ? Je n'ai pas trouvé de méthode simple pour supprimer ces ajouts.

    Si j'essaie d'encoder les intervalles de balise en JSON, j'obtiens le message suivant :

    TypeError: Object of type Tcl_Obj is not JSON serializable

    Il y a peut-être quelque-chose qui m'a échappé dans la doc mais je pense avoir bien cherché et testé.

    Avez-vous des pistes pour m'aider?
    Cordialement

  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
    Salut,

    Citation Envoyé par LeVraiGaulois Voir le message
    Il y a peut-être quelque-chose qui m'a échappé dans la doc mais je pense avoir bien cherché et testé.
    Rassurez vous, c'est pas dans la documentation.

    Le fait est que tout ce qui vient de TK n'est pas décodé par tkinter (comme ici) et il faut se le farcir "à la main".

    Remplacez la ligne 18 par: zones = [ str(z) for z in widText.tag_ranges(strTag) ] pour corriger çà.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Physique et chimie depuis 1983 mais Langage Python depuis juin 2021
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Physique et chimie depuis 1983 mais Langage Python depuis juin 2021
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Rassurez vous, c'est pas dans la documentation.
    Merci de m'avoir aidé si vite et si bien,

    la nouvelle ligne donne entière satisfaction, mon problème est résolu grâce à vous.

    Pour la documentation de tkinter, c'est mieux de savoir qu'elle nous "cache" des choses mais ce n'est pas vraiment rassurant, surtout avec une bibliothèque aussi ancienne.

    Bonne continuation.

  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 LeVraiGaulois Voir le message
    Pour la documentation de tkinter, c'est mieux de savoir qu'elle nous "cache" des choses mais ce n'est pas vraiment rassurant, surtout avec une bibliothèque aussi ancienne.
    Elle ne cache rien, elle manque un peu de "finition".
    Mais ce n'est pas trop grave car pour faire des choses un peu avancées avec, il faut savoir programmer (et si on cherche des solutions à un problème on les trouve assez rapidement.
    Imaginez disposer d'une documentation papier incomplète, quelques exemples qui fontionnet sans Web mais quelques newgroups qui permettent aux Européen d'échanger avec des américains... Il faut se lever tôt pour les avoir derrière leur clavier ou patienter...

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/03/2019, 08h01
  2. [Python 3.X] Changer la couleur d'un caractère dans un widget Text (tkinter)
    Par Michel Voisin dans le forum Général Python
    Réponses: 6
    Dernier message: 04/11/2017, 12h00
  3. Question de TkInter / Widget text.mark_set
    Par Captain'Flam dans le forum Général Python
    Réponses: 7
    Dernier message: 29/04/2014, 13h57
  4. [tkinter] widget text et scrollbar
    Par jojolapine dans le forum Tkinter
    Réponses: 3
    Dernier message: 29/04/2006, 15h58
  5. [Tkinter] widget Text
    Par t_om84 dans le forum Tkinter
    Réponses: 8
    Dernier message: 17/06/2005, 09h30

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