es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Desplazamiento automático de Python en el widget de texto gtk textview.

Acabo de iniciar un nuevo proyecto, solo quiero aprender más sobre gtk, hilos, sockets y clases, así que decidí desarrollar un cliente IRC simple.

Tengo algún código, pero no puedo encontrar una solución para esto:

¿Cómo puedo prohibir el desplazamiento horizontal en el widget textview de gtk y también desplazar automáticamente el widget textview hacia abajo?

¡Gracias de antemano!

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Pango

class TextViewWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="TinyIRC")

        self.set_default_size(700, 500)

        self.grid = Gtk.Grid()
        self.add(self.grid)

        self.create_chatbox()
        self.create_entry()

    def create_chatbox(self):
        scrolledwindow = Gtk.ScrolledWindow()
        scrolledwindow.set_hexpand(True)
        scrolledwindow.set_vexpand(True)
        self.grid.attach(scrolledwindow, 0, 1, 3, 1)

        self.textview = Gtk.TextView()
        self.textbuffer = self.textview.get_buffer()
        start_iter = self.textbuffer.get_start_iter()

        self.textbuffer.insert(start_iter, "This is some text ")
        self.textbuffer.insert_markup(self.textbuffer.get_end_iter(), "<b>and some bold text</b>", -1)

        scrolledwindow.add(self.textview)

    def create_entry(self):
        self.entry_box = Gtk.Entry()
        self.grid.attach(self.entry_box, 0, 2 ,3 ,1)
        self.entry_box.connect("activate", self.enter_pressed)

    def enter_pressed(self, widget):
        given_msg=self.entry_box.get_text()
        send_msg=given_msg
        print(given_msg)
        end_iter = self.textbuffer.get_end_iter()
        self.textbuffer.insert(end_iter, send_msg+'\n')
        self.entry_box.set_text("")


win = TextViewWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar que haya desplazamiento horizontal en el widget textview de gtk, puedes usar el método set_wrap_mode() del textview y establecerlo en Gtk.WrapMode.WORD. Esto hará que el texto se ajuste a los límites de las palabras, desactivando efectivamente el desplazamiento horizontal.

    Para desplazar automáticamente el widget textview hasta el final, puedes usar el método scroll_to_mark() del textview. Primero, debes crear una marca al final del buffer usando el método create_mark(), y luego desplazarte hasta esa marca utilizando el método scroll_to_mark().

    Aquí tienes el código actualizado con estos cambios:

    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk, Pango
    
    class TextViewWindow(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="TinyIRC")
    
            self.set_default_size(700, 500)
    
            self.grid = Gtk.Grid()
            self.add(self.grid)
    
            self.create_chatbox()
            self.create_entry()
    
        def create_chatbox(self):
            scrolledwindow = Gtk.ScrolledWindow()
            scrolledwindow.set_hexpand(True)
            scrolledwindow.set_vexpand(True)
            self.grid.attach(scrolledwindow, 0, 1, 3, 1)
    
            self.textview = Gtk.TextView()
            self.textview.set_wrap_mode(Gtk.WrapMode.WORD) # desactivar desplazamiento horizontal
            self.textbuffer = self.textview.get_buffer()
            start_iter = self.textbuffer.get_start_iter()
    
            self.textbuffer.insert(start_iter, "Este es algún texto ")
            self.textbuffer.insert_markup(self.textbuffer.get_end_iter(), "<b>y algún texto en negrita</b>", -1)
    
            scrolledwindow.add(self.textview)
    
        def create_entry(self):
            self.entry_box = Gtk.Entry()
            self.grid.attach(self.entry_box, 0, 2 ,3 ,1)
            self.entry_box.connect("activate", self.enter_pressed)
    
        def enter_pressed(self, widget):
            given_msg = self.entry_box.get_text()
            send_msg = given_msg
            print(given_msg)
            end_iter = self.textbuffer.get_end_iter()
            self.textbuffer.insert(end_iter, send_msg+'\n')
    
            # desplazar hasta el final del buffer
            end_mark = self.textbuffer.create_mark(None, end_iter, False)
            self.textview.scroll_to_mark(end_mark, 0.0, True, 0.0, 1.0)
    
            self.entry_box.set_text("")
    
    win = TextViewWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()
    

    Espero que esto sea de ayuda. ¡Avísame si tienes alguna otra pregunta!

Comments are closed.