Python Forum
[gtk] How to modify a part of a text of a gtk textview
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[gtk] How to modify a part of a text of a gtk textview
#1
I learn GTK with Python and I've a problem with the widget texview. I'd like to changed / modify specific part of a text in a buffer (textview).

For example, the text buffer:

    long_text = "line 1 word 1 word 2 word 3 \n" \
                "line 2 [WORD TO REPLACE]  \n" \
                "line 3 \n"
I 'd to replace the section [WORD TO REPLACE] by the value of a Gtk.Entry. I know how to add the entry a the end of the buffer, but I'm not able to replace from inside the text itself.

The entire code:

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)
Any idea is welcome. Thanks.
Reply
#2
Solved. The iter_start and iter_end is only when a part of the buffer is selected with the mouse
So , I copy the buffer in a var and run the treatment on this var. Finally just re inject the modified var in the buffer (buffertext.set_text() )
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Tkinter] Can I modify part of 'Values' value of Treeview item? water 0 2,656 Dec-29-2020, 09:35 PM
Last Post: water
  Part of code is adding extra new line when saving to text file. lovepeace 9 4,868 Aug-24-2019, 12:52 PM
Last Post: lovepeace
  How to Use Gtk.Textview navinandrewprince 0 2,300 Aug-16-2017, 03:45 AM
Last Post: navinandrewprince

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020