Why the method set_color_foreground and its companions set_color_XXX don't work in Vte ( Python - Gtk3)?

StackOverflow https://stackoverflow.com/questions/14459877

Pregunta

I am writing an application using Vte in Python + Gtk3.
I am not able to change all the color.

For example, for the foreground color, I tried this code, but the text color doesn't change:

class Shell(Gtk.Box):
    def __init__(self,on_close_button_cb,path = ""):
        super(Shell,self).__init__(orientation=Gtk.Orientation.VERTICAL)

        v = Vte.Terminal()
        v.set_color_foreground(Gdk.Color(65535,0,0))
        v.set_size(80,80)
        v.show_all()

        if path == "":
            path = os.environ['HOME']

        self.vpid = v.fork_command_full( Vte.PtyFlags.DEFAULT, path, ["/bin/bash"], [], GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None,)
        self.pack_start(v,True,True,0)

        self.set_visible(True)
¿Fue útil?

Solución

Changing color of a Vte.Terminal() widget has to be done after the terminal widget has been realized. Otherwise color changes done with the set_colors(), set_color_foreground(), etc methods are not taken into account.

The following working example proposes two ways of doing this. The example uses a color palette and set_colors(), but the same holds if you would want to use the set_color_foreground() or other set_color_*() methods. Personally, I prefer option 1:

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk, Gdk, Vte, GLib

palette_components = [ 
    (0, 0x0707, 0x3636, 0x4242),    # background
    (0, 0xdcdc, 0x3232, 0x2f2f),
    (0, 0x8585, 0x9999, 0x0000),
    (0, 0xb5b5, 0x8989, 0x0000),
    (0, 0x2626, 0x8b8b, 0xd2d2),
    (0, 0xd3d3, 0x3636, 0x8282),
    (0, 0x2a2a, 0xa1a1, 0x9898),
    (0, 0xeeee, 0xe8e8, 0xd5d5),    # foreground
    (0, 0x0000, 0x2b2b, 0x3636),
    (0, 0xcbcb, 0x4b4b, 0x1616),
    (0, 0x5858, 0x6e6e, 0x7575),
    (0, 0x6565, 0x7b7b, 0x8383),
    (0, 0x8383, 0x9494, 0x9696),
    (0, 0x6c6c, 0x7171, 0xc4c4),
    (0, 0x9393, 0xa1a1, 0xa1a1),
    (0, 0xfdfd, 0xf6f6, 0xe3e3)
    ]

palette = []
for components in palette_components:
    color = Gdk.Color(components[1], components[2], components[3])
    palette.append(color)


def terminal_realize_cb(terminal):
    terminal.set_colors(None, None, palette)


if __name__ == '__main__':
    window = Gtk.Window()
    window.connect('delete-event', Gtk.main_quit)

    terminal = Vte.Terminal()

    # Option 1: connect to the terminal widget's realize event
    # and call it's set_colors() method there
    terminal.connect('realize', terminal_realize_cb)

    terminal.fork_command_full(Vte.PtyFlags.DEFAULT,
                               None,
                               ['/bin/bash'],
                               [],
                               GLib.SpawnFlags.DO_NOT_REAP_CHILD,
                               None,
                               None)

    window.add(terminal)
    window.show_all()

    # Option 2: call the terminal's set_colors() method
    # after the window has been shown (which indirectly
    # realizes the terminal widget)
    #terminal.set_colors(None, None, palette)

    Gtk.main()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top