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 :

Sélectionner texte dans HTMLLabel [Python 3.X]


Sujet :

Tkinter Python

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 269
    Points : 98
    Points
    98
    Par défaut Sélectionner texte dans HTMLLabel
    Bonjour à tous,

    Je cherche en vain comment sélectionner du texte dans un widget HTMLLabel (tkhtmlview).

    Sélectionner du texte dans un widget tkinter habituel ne me pose pas de problème et surtout on trouve des exemples en ligne. En revanche, pour ce widget de la bibliothèque tkhtmlview je n'y arrive pas et je ne trouve pas non plus de documentation.

    Voici un exemple :
    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
    import tkinter
    from tkhtmlview import HTMLLabel
     
    class Application(tkinter.Tk):
        def __init__(self):
            tkinter.Tk.__init__(self)
            self.creer_widgets()
     
        def creer_widgets(self):
     
            # widget html_label
            self.html_label1 = HTMLLabel(self, html="""<h3>MERCI de sélectionner le 1er mot de cette phrase.</h3>""",state=tkinter.NORMAL)
            self.html_label1.pack()
     
     
     
    if __name__ == "__main__":
        app = Application()
        app.title("Sélectionner texte dans HTMLLabel")
        app.mainloop()

    Il n'est pas possible de cliquer sur ce widget pour faire apparaitre le curseur. J'ai d'abord pensé qu'il fallait modidier les options et j'ai donc ajouté 'state=tkinter.NORMAL' mais sans résultat.

    D'avance merci à qui pourra m'aiguiller.

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 245
    Points : 4 742
    Points
    4 742
    Par défaut
    bonjour
    Citation Envoyé par Chris33 Voir le message
    je ne trouve pas non plus de documentation.
    ? tu as regardé le code source au moins ? Ce n'est qu'un simple tk.Text

    pas possible de cliquer sur ce widget pour faire apparaitre le curseur.
    Oui, encore heureux : tu as choisi délibérément d'utiliser un label et non un texte

    il fallait modidier les options et j'ai donc ajouté 'state=tkinter.NORMAL'
    voir le source ... ce que n'a pas HTMLText
    $moi= ( !== ) ? : ;

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

    Citation Envoyé par Chris33 Voir le message
    En revanche, pour ce widget de la bibliothèque tkhtmlview je n'y arrive pas et je ne trouve pas non plus de documentation.
    On ne sait pas sélectionner du texte dans un Label tkinter!
    Tous les exemples (que j'ai trouvé) remplacent le widget Label par un widget Entry ou un widget Text.

    Or si on lit lit les sources(*) de tkhtmlview, on constate qu'un HTMLLabel hérite déjà, in fine, d'un tk.Text (et c'est ce que diit aussi la documentation).

    Après ça ne dit pas comment faire... ni que ce sera "simple": si le widget Text utilisé dans HTMLxyz a été codé pour désactiver la sélection, il va falloir trouver comment inhiber cela temporairement ou définitivement. Ce qui demandera de comprendre le "comment" pour imaginer le "pourquoi" et ajouter la fonctionnalité souhaitée.
    C'est bien plus compliqué que remplacer un widget par un autre! Et si personne n'a eu besoin de faire cela et le rendre disponible, vous avez du boulot...

    - W

    (*) la "vraie" documentation.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 269
    Points : 98
    Points
    98
    Par défaut
    Sur cette page :https://www.tresfacile.net/afficher-...ec-tkhtmlview/

    je lis ceci : html_label.get_selected_text():Cette méthode retourne le texte sélectionné dans le widget HTMLLabel. Cela peut être utile si vous souhaitez permettre aux utilisateurs de sélectionner et de manipuler le texte affiché.
    ... c'est pourquoi je pense que ça devrait être possible. Cependant, je ne suis pas attaché spécifiquement à ce widget. J'ai essayé également le HTMLScrolledText qui d'ailleurs me conviendrait mieux Sur ce dernier widget, je peux cliquer avec la souris mais toujours pas sélectionner un texte.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 514
    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 514
    Points : 37 131
    Points
    37 131
    Par défaut
    Citation Envoyé par Chris33 Voir le message
    ... c'est pourquoi je pense que ça devrait être possible.
    Si le widget définissait ce genre de méthode, vous pourriez essayer de l'appeler...(*)
    Elle serait documentée dans la documentation succincte de la bibliothèque (qui dit déjà "All widget classes inherits from the tkinter.Text() base class.").

    Citation Envoyé par Chris33 Voir le message
    Cependant, je ne suis pas attaché spécifiquement à ce widget. J'ai essayé également le HTMLScrolledText qui d'ailleurs me conviendrait mieux Sur ce dernier widget, je peux cliquer avec la souris mais toujours pas sélectionner un texte.
    Un HTMLLabel est déjà un (hérite de) HTMLScrolledText...

    - W
    (*) regarder si (et où) cette méthode est définie dans les sources marche aussi. Tester par vous même est plus accessible/rapide/...
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 269
    Points : 98
    Points
    98
    Par défaut
    Rebonjour,

    Pour avoir de l'aide, j'utilise la commande :Effectivement, la méthode ".get_selected_text()" n'y figure pas.
    En revanche, je trouve la méthode selection_get() - Methods inherited from tkinter.Misc

    Sachant également qu'on peut utiliser des tags, je suppose qu'il est possible (pour l'utilisateur) de sélectionner du texte mais que pour cela, il doit y avoir un paramètre à définir. Je note également qu'avec HTMLScrolledText, on peut cliquer dans le widget et faire apparaitre le curseur.


  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 514
    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 514
    Points : 37 131
    Points
    37 131
    Par défaut
    Citation Envoyé par Chris33 Voir le message
    En revanche, je trouve la méthode selection_get() - Methods inherited from tkinter.Misc
    Faites help(tkinter.Misc.selection_get) pour voir que ça ne vous mène pas très loin...

    Citation Envoyé par Chris33 Voir le message
    Sachant également qu'on peut utiliser des tags, je suppose qu'il est possible (pour l'utilisateur) de sélectionner du texte mais...
    En matière de programmation beaucoup de choses sont possibles... mais dans la réalité, sauf à trouver le code sur Internet, il va falloir l'écrire... ce qui réduit le champ des possibles.

    *edit*: un petit test pour comparer HTMLText et tk.Text montre que la sélection fonctionne (on retourne ce qui a été sélectionné via .selection_get()). Ce qui ne marche pas, c'est la visualisation de la sélection (on ne sait pas ce qui a été sélectionné pour le HTMLText)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 269
    Points : 98
    Points
    98
    Par défaut
    Rebonjour,

    Je reviens sur cette question de comment sélectionner du texte dans un widget HTMLLabel.

    En fait, on y arrive en liant ce widget à un événement, puis en utilisant les tags et la méthode tag_config()

    Voici le code que je vais utiliser :

    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
    import tkinter
    from tkhtmlview import HTMLLabel, HTMLScrolledText
    from string import ascii_letters
     
    class Application(tkinter.Tk):
        def __init__(self):
            tkinter.Tk.__init__(self)
            self.creer_widgets()
     
        def creer_widgets(self):
            # widget html_ScrollText1
            self.html_ScrollText1= HTMLScrolledText(self)
            self.html_ScrollText1.bind("<Double-Button>", self.doubleClick)
            self.html_ScrollText1.pack()
            self.html_ScrollText1.set_html("""<h3>MERCI de sélectionner le 1er mot de cette phrase.</h3>""")
     
     
        def doubleClick(self,event):
            print("---------- doubleClick ________________")
            debut=self.html_ScrollText1.index(tkinter.CURRENT) # debut (ligne,col)
            debutCol=int(debut.split('.')[1]) #
            print('--- debutCol : ',debutCol)
            listelettre=ascii_letters+'é'+'è'+'ê'+'à'
     
            while 1 :
                print('____________ boucle récup indice début ----------------')
                # Cette boucle while permet de récupérer l'indice de DEBUT pour le mot qui a été double-cliqué
                debutCol=debutCol-1
                nouveau_debut="1.{}".format(debutCol)
                caractere=self.html_ScrollText1.get(nouveau_debut)
     
                if not caractere in listelettre or debutCol==0:
                    if caractere==' ':
     
                        debutCol=debutCol+1
                        nouveau_debut="1.{}".format(debutCol)
                    break
     
     
            while 1 :
                # Cette boucle while permet de récupérer l'indice de FIN pour le mot qui a été double-cliqué
                print('____________ boucle récup indice fin ----------------')
                debutCol=debutCol+1
                fin="1.{}".format(debutCol)
     
                caractere=self.html_ScrollText1.get(fin)
     
                if not caractere in listelettre:
                    if caractere==' ':
                        print('espace')
                        debutCol=debutCol
                        fin="1.{}".format(debutCol)
                    break
     
     
     
     
            mot_selectionne=self.html_ScrollText1.get(nouveau_debut, fin)
            print('mot_selectionné : ',mot_selectionne)
     
            self.html_ScrollText1.tag_delete("ma_selection","1.0", tkinter.END+'1l')
            self.html_ScrollText1.tag_add("ma_selection",nouveau_debut,fin)
            self.html_ScrollText1.tag_config("ma_selection",background="black",foreground="white")
     
     
     
     
    if __name__ == "__main__":
        app = Application()
        app.title("Sélectionner texte dans HTMLLabel ou html_ScrollText1")
        app.mainloop()
    Ceci fonctionne aussi bien avec HTMLLabel qu'avec HTMLScrolledText.
    Pour l'instant, il reste quelques bugs à corriger (et notamment) lors de la toute 1ère sélection : le mot est bien sélectionné mais un 'background' de couleur bleue apparait jusqu'en fin de ligne... Par ailleurs, ici, on suppose que le widget ne contient qu'une seule ligne.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 269
    Points : 98
    Points
    98
    Par défaut
    Voici pour ceux que ça pourrait intéresser le code revu et corrigé.

    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
    #-------------------------------------------------------------------------------
    # Name:    HTMLScrolledText
    # Purpose: Sélectionne des mots dans le widget HTMLScrolledText de tkhtmlview
    # Author:      Chris33#
    # Created:     26/11/2024
    #-------------------------------------------------------------------------------
     
     
    import tkinter
    from tkhtmlview import HTMLLabel, HTMLScrolledText
     
    class Application(tkinter.Tk):
        def __init__(self):
            tkinter.Tk.__init__(self)
            self.creer_widgets()
     
        def creer_widgets(self):
            # widget html_ScrollText1
            self.html_ScrollText1= HTMLScrolledText(self)
            self.html_ScrollText1.bind("<Double-Button>", self.doubleClick)
            self.html_ScrollText1.pack()
            self.html_ScrollText1.set_html("""Many of the widget commands for texts take one or more indices as arguments. An index is a string used to indicate a particular place within a text, such as a place to insert characters or one endpoint of a range of characters to delete. Indices have the syntax
     
    base modifier modifier modifier ...
     
    Where base gives a starting point and the modifiers adjust the index from the starting point (e.g. move forward or backward one character). Every index must contain a base, but the modifiers are optional.
     
    The base for an index must have one of the following forms:
     
    line.char
        Indicates char'th character on line line. Lines are numbered from 1 for consistency with other UNIX programs that use this numbering scheme. Within a line, characters are numbered from 0. If char is end then it refers to the newline character that ends the line.
        <br>wordstart<br>
        Adjust the index to refer to the first character of the word containing the current index. A word consists of any number of adjacent characters that are letters, digits, or underscores, or a single character that is not one of these.
     
    <br>wordend<br>
        Adjust the index to refer to the character just after the last one of the word containing the current index. If the current index refers to the last character of the text then it is not modified.
     
    If more than one modifier is present then they are applied in left-to-right order. For example, the index ``end - 1 chars'' refers to the next-to-last character in the text and ``insert wordstart - 1 c'' refers to the character just before the first one in the word containing the insertion cursor. Modifiers are applied one by one in this left to right order, and after each step the resulting index is constrained to be a valid index in the text widget. So, for example, the index ``1.0 -1c +1c'' refers to the index ``2.0''""")
     
        def doubleClick(self,event):
            print("---------- doubleClick ________________")
            posClick=self.html_ScrollText1.index(tkinter.CURRENT) # debut (ligne,col)
     
            # Utilisation des indice 'wordstart' & 'wordend' pour chercher les positions de début et fin
            debut=self.html_ScrollText1.index("{} wordstart".format(posClick))
            fin=self.html_ScrollText1.index("{} wordend".format(posClick))
     
            mot_selectionne=self.html_ScrollText1.get(debut, fin)
     
            # Mise en forme de la sélection
            self.html_ScrollText1.tag_delete("ma_selection")
            self.html_ScrollText1.tag_add("ma_selection",debut,fin)
            self.html_ScrollText1.tag_config("ma_selection",background="black",foreground="white")
     
     
     
    if __name__ == "__main__":
        app = Application()
        app.title("Sélectionner texte dans HTMLLabel ou html_ScrollText1")
        app.mainloop()

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 514
    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 514
    Points : 37 131
    Points
    37 131
    Par défaut
    Les tâtonnements précédents m'ont suggéré l'écriture du code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import tkinter as tk
    from tkhtmlview import HTMLText
     
    w = HTMLText(height=10)
    w.set_html('<h3>' + 'azertyuiop ' * 4 + '</h3>')
    w.tag_raise(tk.SEL)
    w.pack()
     
    def show_selected():
       print('w :', w.selection_get())
     
    tk.Button(text='show selected', command = show_selected).pack()
    tk.mainloop()
    qui restore les fonctionnalités de la sélection (et donne une idée sur le soucis rencontré).

    edit: ça marche tout pareil avec HTMLabel à la place d'un HTMLText (puisque c'était le sujet de départ). Reste qu'une piste de solution n'est pas encore la solution.

    - 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. comment remplacer une partie de texte dans un champs
    Par patlapi dans le forum Paradox
    Réponses: 4
    Dernier message: 20/11/2003, 15h38
  2. Texte dans un canevas
    Par Bernard M dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2002, 18h56
  3. Centrer un texte dans un string Grid
    Par christine dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/10/2002, 23h33
  4. taille du texte dans un viewport
    Par pitounette dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/07/2002, 13h06
  5. Réponses: 2
    Dernier message: 10/06/2002, 12h03

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