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 :

sauvegarder TAGs widget texte [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 283
    Par défaut sauvegarder TAGs widget texte
    Bonjour à tous,

    Lorsque j'enregistre le contenu d'un widget text tkinter dans un fichier, je perds la mise en forme du texte (mise en forme effectuée avec les tags tkinter).
    Ecrire du texte dans un fichier, ne me pose pas de problème. En revanche, je ne comprends pas comment les tags sont sauvegardés.
    Si quelqu'un à une piste...
    D'avance merci.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 994
    Par défaut
    Bonjour,

    Pourquoi écrire dans un fichier texte ? Outre la raison, il est normal d'en perdre la mise en forme...

    Si le but est de sauvegarder les informations inscrites, il faudra un autre moyen comme les bases de données ou peut-être plus simple, la sérialisation.

    Il faudrait savoir ce qui se passe quand on écrit dans votre widget Text niveau code pour avoir une idée.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Citation Envoyé par Chris33 Voir le message
    En revanche, je ne comprends pas comment les tags sont sauvegardés.
    Ils ne sont pas sauvegardés: c'est à vous de le faire.

    La piste pourrait commencer avec la commande dump du widget Text...

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

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 283
    Par défaut
    Tout d'abord merci à tous les 2.

    Oui grâce à la commande , j'ai trouvé et commencé mes réflexions avec dump(self, index1, index2=None, command=None, **kw)
    puis j'ai utilisé .tag_ranges('tag_name') qui renvoie une liste de tous les tags.
    Je peux alors enregistrer cette liste dans un fichier .txt (après conversion) et la recharger ensuite pour retrouver tous les tags. Suffit alors d'utiliser tag_add et tag_config...

    Mon code est actuellement plus que brouillon, mais je confirme ça marche.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Pour ne retourner que les informations sur l'assignation des tags au texte avec text.dump, la syntaxe serait plutôt text.dump('1.0', 'end-1c', tag=True).

    Ce qui retourne une liste de tuple a 3 valeurs qu'on peut sauvegarder/serialiser via pickle.

    Il me semble plus facile de partir de tout ce que retourne text.dump pour reconstruire text et formatage en traitant séquentiellement la liste de tuples.

    text.dump ne retourne que le nom des tags, pour récupérer comment ils sont définis il faut effectivement passer par tag_names et tag_configure. Ce qui permet de récupérer un dictionnaire de dictionnaires.

    Ca peut paraitre laborieux mais c'est pas si compliqué.

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

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 283
    Par défaut
    Voici la solution que je propose :
    #-------------------------------------------------------------------------------
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    # Name:        enregistrer/mémoriser/...et retrouver TAGs tkinter
    # Author:      chris33
    #
    # Created:     06/01/2025
    # Copyright:   (c) chris 2025
    # Licence:     <your licence>
    #-------------------------------------------------------------------------------
     
    import tkinter
    from tkhtmlview import HTMLScrolledText
     
     
    class Application(tkinter.Tk):
        def __init__(self):
            tkinter.Tk.__init__(self)
            self.creer_widgets()
     
        def creer_widgets(self):
            # self.frame1
            self.frame1 = tkinter.Frame(self, width=300, height=100, bg='grey')
            self.frame1.pack(fill=tkinter.X)
     
            # self.html_ScrollText1
            self.html_ScrollText1 = HTMLScrolledText(self.frame1, state=tkinter.NORMAL, html='en attente')
     
            self.html_ScrollText1.pack(expand=1,fill='both')
            self.charger_fichier()
     
            # self.frame2
            self.frame2 = tkinter.Frame(self, width=100, height=50, bg='red') #  -> pour OUTILS MISE EN FORME TEXTE
            self.frame2.pack(fill=tkinter.X)
            self.label2= tkinter.Label(self.frame1,text="OUTILS MISE EN FORME TEXTE")
            self.label2.pack(fill=tkinter.X)
            self.button_2=tkinter.Button(self.frame2,text='jaune',command=self.jaune,background='yellow')
            self.button_2.pack()
     
     
        def jaune(self):
            print('______ jaune()   ____________')
     
            ### ACTIVER LIGNES SUIVANTES POUR DEFINIR QUELQUES TAGS
            #self.html_ScrollText1.tag_add('jaune','1.5','1.11')
            #self.html_ScrollText1.tag_add('jaune','2.12','2.25')
            #self.html_ScrollText1.tag_add('jaune','2.20','2.30')
            #self.html_ScrollText1.tag_add('jaune','2.35','2.45')
            #self.html_ScrollText1.tag_add('jaune','4.22','4.35')
            #self.html_ScrollText1.tag_config("jaune",background="yellow",foreground="white")
     
            # --------------------------   tag_ranges  ----------------------------------
            # self.html_ScrollText1.tag_ranges : Renvoie une liste décrivant toutes les plages de texte qui ont été balisées avec tagName.
            # Les deux premiers éléments de la liste décrivent la première plage balisée dans le texte,
            #  les deux éléments suivants décrivent la deuxième plage, et ainsi de suite. Le premier élément de chaque paire contient
            #   l'index du premier caractère de la plage, et le deuxième élément de la paire contient l'index du caractère juste après
            #    le dernier de la plage. S'il n'y a aucun caractère balisé avec tag, une chaîne vide est renvoyée.
            liste=self.html_ScrollText1.tag_ranges('jaune')
            print('liste : ',liste)
            for tag in liste:
                print('tag',tag)
     
            # REACTIVER LA LIGNE SUIVANTE POUR ENREGISTRER TAGGs
            #self.enregistrer_list_tags(liste)
     
            liste_tag=self.charger_list_tags()
            cpteur=0
            for tag in liste_tag:
                try:
                    self.html_ScrollText1.tag_add('jaune2',liste_tag[cpteur],liste_tag[cpteur+1])
                    cpteur+=2
                except:
                    pass
     
            self.html_ScrollText1.tag_config("jaune2",background="green",foreground="white")
     
     
     
        def charger_fichier(self):
            """
            lire le contenu de mon fichier text et l'afficher dans html_ScrollText'
            """
     
            chaineHtml=''
     
            # Lecture fichier
            with open(r"C:\Users\chris\Documents\mesScryptPython\fichier\fichier_aide.txt",'r') as fichier:
                for ligne in fichier:
                    chaineHtml=chaineHtml+ligne+"<br>"
                print('chaineHtml : ',chaineHtml)
     
            # Affichage
            self.html_ScrollText1.set_html(chaineHtml)
     
     
        def enregistrer_list_tags(self,liste):
            """
            La (et plus tard LES LISTES) tags sont enregistrés dans un fichier distint
            """
            chaine=''
            with open(r"C:\Users\chris\Documents\mesScryptPython\fichier\tags.txt",'w') as fichier:
                for tag in liste:
                    chaine=chaine+str(tag)+';'
                print('chaine : ',chaine[:-1])
                fichier.write(chaine[:-1])
     
        def charger_list_tags(self):
            """
            exemple de liste renvoyée (pour un UNIQUE tag) : liste indice :  ['1.5', '1.11', '2.12', '2.30', '2.35', '2.45', '4.22', '4.35']
            """
            print("--------   charger_list_tags()   ------------")
            liste=[]
            with open(r"C:\Users\chris\Documents\mesScryptPython\fichier\tags.txt",'r') as fichier:
                for ligne in fichier :
                    ligne2=ligne.split((';'))
                    for indice in ligne2:
                        print('indice : ',indice)
                        liste.append(indice)
            print('liste indice : ',liste)
            return liste
     
     
     
    if __name__ == "__main__":
        app = Application()
        app.title("Mémoriser tags)")
        app.geometry('1900x1550')
        #app.configure(background="blue")
        app.mainloop()
    Bien qu'ayant débuté avec dump(), je suis atterris de cette manière. Encore une fois, ce code fonctionne mais il est très certainement possible de trouver d'autres possibilités. Je laisse, pour l'instant ce sujet comme "non résolu" pour permettre à chacun de suggérer sa solution.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Citation Envoyé par Chris33 Voir le message
    Encore une fois, ce code fonctionne mais il est très certainement possible de trouver d'autres possibilités.
    Quand je lis un truc comme:
    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
    def charger_fichier(self):
            """
            lire le contenu de mon fichier text et l'afficher dans html_ScrollText'
            """
     
            chaineHtml=''
     
            # Lecture fichier
            with open(r"C:\Users\chris\Documents\mesScryptPython\fichier\fichier_aide.txt",'r') as fichier:
                for ligne in fichier:
                    chaineHtml=chaineHtml+ligne+"<br>"
                print('chaineHtml : ',chaineHtml)
     
            # Affichage
            self.html_ScrollText1.set_html(chaineHtml)
    qui pourrait se résumer à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def charger_fichier(self):
            """
            lire le contenu de mon fichier text et l'afficher dans html_ScrollText'
            """
            path = r"C:\Users\chris\Documents\mesScryptPython\fichier\fichier_aide.txt"
            with open(path) as f:
                data = f.read()
            data.replace('\n', '<br>')
     
            # Affichage
            self.html_ScrollText1.set_html(data)
    effectivement, on va pouvoir faire mieux.. mais pour quoi faire?

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

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 283
    Par défaut
    Je poursuis et termine ce sujet pour confirmer que la méthode ci-dessus fonctionne. Je viens en effet de terminer le programme que je voulais. L'une des difficultés était de sauvegarder les mises en forme effectuées par l'utilisateur lui-même. Il s'agissait effectivement de sauvegarder son texte mais aussi les mises en forme qu'il souhaitait. LE PROBLÈME EST MAINTENANT RÉSOLU.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 577
    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 577
    Par défaut
    Citation Envoyé par Chris33 Voir le message
    LE PROBLÈME EST MAINTENANT RÉSOLU.
    Savoir comment réaliser votre fonctionnalité se réduit à utiliser des fonctionnalités existantes: apprendre, ouvrir une documentation n'est pas un problème.... c'est probablement plus de 50% de l'activité d'un programmeur.

    - 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. [Python 2.X] widget text: récupérer le texte associé à un tag.
    Par SidereusNuncius dans le forum Tkinter
    Réponses: 4
    Dernier message: 04/07/2016, 19h30
  2. [Widget Text] Retrouver l'index d'un tag ?
    Par PauseKawa dans le forum Tkinter
    Réponses: 1
    Dernier message: 10/03/2013, 14h31
  3. Réponses: 2
    Dernier message: 20/09/2008, 22h17
  4. Tstringgrid sauvegardé dans fichier texte
    Par kykyn dans le forum C++Builder
    Réponses: 11
    Dernier message: 15/02/2006, 16h52
  5. [Tkinter] widget Text
    Par t_om84 dans le forum Tkinter
    Réponses: 8
    Dernier message: 17/06/2005, 10h30

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