Почему метод set_color_foreground и его компаньоны set_color_XXX не работают в Vte (Python - Gtk3)?

Я пишу приложение, используя Vte в Python + Gtk3.
Я не могу изменить все цвета.

Например, для цвета переднего плана я пробовал этот код, но цвет текста не меняется:

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)

person Irr    schedule 22.01.2013    source источник
comment
У меня тот же вопрос, но на С.   -  person Rrjrjtlokrthjji    schedule 27.06.2013


Ответы (1)


Изменение цвета виджета Vte.Terminal() должно быть выполнено после реализации виджета терминала. В противном случае изменения цвета, выполненные с помощью методов set_colors(), set_color_foreground() и т. д., не учитываются.

В следующем рабочем примере предлагаются два способа сделать это. В примере используется цветовая палитра и set_colors(), но то же самое верно, если вы захотите использовать set_color_foreground() или другие методы set_color_*(). Лично я предпочитаю вариант 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()
person dieterv    schedule 27.08.2013