Как изменить цвет фона Gtk.Инфобар на желтый?


Цвет фона по умолчанию кажется синим (из темы Adwaita), даже если я установил тип сообщения на предупреждение. Я предпочитаю использовать CSS.

example.py:

# coding=utf-8

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

w = Gtk.Window()
ib = Gtk.InfoBar()

w.add(ib)
w.connect("delete-event", Gtk.main_quit)

provider = Gtk.CssProvider()
provider.load_from_path("style.css")

w.get_style_context()
     .add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)

w.show_all()
Gtk.main()

style.css:

infobar {
    background-color: yellow;
}

Скриншот :

Скриншот с проблемой

Я использую Python 2.7.13 и GTK+ 3.22 на Windows 10 со всеми установленными обновлениями и через MSYS2 со всеми обновлениями, установленными с pacman -Syyu.

1 2

1 ответ:

Из Python Gtk API :

Gtk.InfoBar имеет один узел CSS с именем infobar. Узел может получить один из классов стиля .info,.предупреждение, .ошибка или .вопрос, в зависимости от типа сообщения.

По умолчанию Gtk.Инфобар тип сообщения: Gtk.MessageType.INFO а твой style.css файл должен быть, например.:

infobar.info {
    background-color: yellow;
}

Таким образом, вы можете быть более конкретным для типа сообщения, который вы устанавливаете, но infobar сам по себе также будет работать. Преимущество это то, что вы можете иметь пользовательские настройки для каждого типа сообщений с помощью infobar.<messagetype>.

Редактировать:

Измените виджет, который получит класс css на Gtk.Пример инфобара:

ib.get_style_context()\
     .add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)

Править 2:

Чтобы добавить CssProvider (StyleProvider) в целом к приложению, у вас есть Gdk.Метод класса экрана Gdk.Screen.add_provider_for_screen (Подробнее здесь )

Изменяя код, чтобы отразить эти изменения, вы получите:

# coding=utf-8

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

w = Gtk.Window()
ib = Gtk.InfoBar()

w.add(ib)
w.connect("delete-event", Gtk.main_quit)

provider = Gtk.CssProvider()
provider.load_from_path("style.css")

Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default (), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

w.show_all()
Gtk.main()