web-dev-qa-db-fra.com

PyGTK TextBuffer ajout d'étiquettes et lecture de texte

Comme dans le sujet, j'ai TextView () et TextBuffer () ajoutés, j'ai également des balises créées, donc quand je sélectionne du texte et clique sur le bouton, il rendra le texte en GRAS ou quelque chose. Jusqu'à présent, tout fonctionne bien, maintenant je dois pouvoir parcourir tout le texte dans TextView et trouver quelle balise est appliquée et où, j'en ai besoin pour pouvoir formater du texte en ajoutant des éléments avant et après le texte balisé.

voici une partie du code:

    self.textview = Gtk.TextView()
    self.buffer = self.textview.get_buffer()
    self.scrolledwindow.add(self.textview)
    self.textview.show()

    self.tag_bold = self.buffer.create_tag("bold", weight=Pango.Weight.BOLD)

Il serait préférable que je puisse obtenir une sortie du type "texte de test" en "gras".

Merci pour toute aide.

2
Majster-pl

[~ # ~] modifier [~ # ~] Voici la fonction correcte à utiliser: Gtk.TextIter.forward_to_tag_toggle()

voici un exemple qui génère une liste de tous les mots en gras:

    start = self.textbuffer.get_start_iter()
    bolded=[]
    while start.forward_to_tag_toggle(self.tag_bold):
        begin=start.copy()
        start.forward_to_tag_toggle(self.tag_bold)
        bolded.append(self.textbuffer.get_text(begin,start,False))
    print bolded

Pendant que vous utilisez pygi (pas pyGTK; notez le Gtk en majuscule dans vos fonctions), de nombreuses fonctions pyGTK sont toujours valides mais peuvent nécessiter quelques ajustements. Vous pouvez obtenir de la documentation ici pour gtk.textiter dans pygtk.

RÉPONSE ANCIENNE: Je ne sais pas si c'est la façon optimale, mais j'ai trouvé que vous pouviez parcourir chaque caractère (peut-être chaque mot si vous voulez) et tester si le personnage a la balise que vous voulez: Voici une fonction simple pour le faire:

    start = self.textbuffer.get_start_iter()
    plus = self.textbuffer.get_start_iter()
    bolded=''
    while plus.forward_char():
        if start.has_tag(self.tag_bold):
            bolded=bolded+(start.get_text(plus))
        start.forward_char()
    print bolded

vous pouvez également utiliser la méthode Gtk.TextIter get_tags () pour obtenir les balises d'un personnage.

Enfin, ce qui peut mieux fonctionner, c'est de stocker les limites dans une liste lorsque vous appliquez les balises pour commencer.

2
Ian B.