Forum EduPython

Echanges autour d'EduPython.

Vous n'êtes pas identifié(e).

#1 2020-11-20 17:06:41

cyrille
Membre
Inscription : 2020-11-20
Messages : 3

[python gtk] Modifier le buffer d'un textview

Bonjour,

J'apprends le GTK couplé à python et j'ai un soucis avec le widget texview. J'aimerais changer / mettre à jour une partie du texte contenu dans le buffer.
Exemple de texte :

long_text = "line 1 word 1 word 2 word 3 \n" \
            "line 2 [WORD TO REPLACE]  \n" \
            "line 3 \n"

J"aimerais remplacer des parties de cette texte [WORD TO REPLACE] par le contenu du Gtk.Entry. Je suis ajouter cette entrée à la fin du buffer mais je n'arrive pas à effectuer l'update dans le texte lui même.
J'ai bien lu et relu la doc mais la notion de iter et de mark m'est abstraite.

Ci dessus le code complet

from gi.repository import Gtk
import sys
 
 
class MyWindow(Gtk.ApplicationWindow):
 
    def __init__(self, app):
        Gtk.Window.__init__(self, title="TextView Example", application=app)
        self.set_default_size(300, 450)
 
        # a scrollbar for the child widget (that is going to be the textview)
        scrolled_window = Gtk.ScrolledWindow()
        scrolled_window.set_border_width(5)
        # we scroll only if needed
        scrolled_window.set_policy(
            Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        scrolled_window.set_min_content_height(400)
        scrolled_window.set_min_content_width(400)
 
        # a text buffer (stores text)
        self.text_buffer = Gtk.TextBuffer()
 
        #Test texte
        long_text = "line 1 word 1 word 2 word 3 \n" \
                    "line 2 [WORD TO REPLACE]  \n" \
                    "line 3 \n"
 
        # a textview (displays the buffer)
        self.textview = Gtk.TextView(buffer=self.text_buffer)
        # wrap the text, if needed, breaking lines in between words
        self.textview.set_wrap_mode(Gtk.WrapMode.WORD)
 
        self.text_buffer = self.textview.get_buffer()
        self.text_buffer.insert_at_cursor(long_text)
 
        # textview is scrolled
        scrolled_window.add(self.textview)
 
        self.entry=Gtk.Entry()
        self.entry.set_text("Entry")
 
        btnUpdate = Gtk.Button(label="Update")
        btnUpdate.connect("clicked", self.update_textview)
 
 
        grid = Gtk.Grid()
        grid.attach(self.entry,0,1,1,1)
        grid.attach(btnUpdate,0,2,1,1)
        grid.attach(scrolled_window,0,3,1,1)
        self.add(grid)
 
    def update_textview(self, widget):
        self.text_buffer.insert_at_cursor(self.entry.get_text() + '\n')
 
class MyApplication(Gtk.Application):
 
    def __init__(self):
        Gtk.Application.__init__(self)
 
    def do_activate(self):
        win = MyWindow(self)
        win.show_all()
 
    def do_startup(self):
        Gtk.Application.do_startup(self)
 
app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)

Donc je voudrais simplement que quand je valide le widget Entry, le buffer se mette à jour avec sa valeur.

Je ne sais pas si c'est possible. Au pire j'effacerai le buffer (delete()), mais cette fonction demande 2 parapètres (début et fin) et je ne sais pas les positionner.

Toute aide serait la bienvenue wink

Hors ligne

#2 2020-11-20 19:13:59

cyrille
Membre
Inscription : 2020-11-20
Messages : 3

Re : [python gtk] Modifier le buffer d'un textview

Bon j'ai relu la doc encore une fois
Si j'ai bien compris le iter_start est le début de la zone sélectionnée à la souris et le iter_end la fin... Donc rien à voir avec une  position absolue.
Donc le plus simple et de régénérer la totalité du buffer (de façon traditonnelle) et de relancer un buffer.set_text() après traitement

Dernière modification par cyrille (2020-11-20 19:23:48)

Hors ligne

#3 2020-11-22 16:09:40

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 308

Re : [python gtk] Modifier le buffer d'un textview

Bonjour, désolé je n'ai jamais utilisé GTK, je vous invite à poser cette question sur le forum de https://www.developpez.com/ à mon avis vous avez plus de chance d'avoir une réponse.

Bonne journée,
Vincent

Hors ligne

#4 2020-11-22 17:57:50

cyrille
Membre
Inscription : 2020-11-20
Messages : 3

Re : [python gtk] Modifier le buffer d'un textview

Merci pour votre réponse
J'ai finalement compris que les iter étaient relatifs au curseur de la souris (enfin plus ou moins)
Donc ce que je cherchais n'est pas possible et je suis passé par le traitement du buffer via son passage dans une variable et je la réinjecte à la sortie de ce traitement.

Finalement le script fonctionne , reste à soigner son écriture et à le tester sur d'autres SE
https://github.com/CyrilleBiot/create_a … t_launcher

Hors ligne

Pied de page des forums