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

I am writing an application using Vte in Python + Gtk3.
I cannot change the whole color.

For example, for the foreground color, I tried this code, but the text color does not 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)

      

+3


source to share


1 answer


Changing the color of the Vte.Terminal () widget should be done after the terminal widget has been implemented. Otherwise, color changes are done using the set_colors (), set_color_foreground (), etc. are not taken into account.

The following working example suggests two ways to do this. The example uses color palette and set_colors (), but the same if you want to use set_color_foreground () or other set_color _ * () methods. I personally 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 realize event
    # and call it 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 set_colors() method
    # after the window has been shown (which indirectly
    # realizes the terminal widget)
    #terminal.set_colors(None, None, palette)

    Gtk.main()

      

+2


source







All Articles