2017-08-22 3 views
2

La couleur d'arrière-plan par défaut semble être bleue (à partir du thème Adwaita), même si j'ai défini le type de message sur Avertissement. Je préfère utiliser CSS.Comment changer la couleur de fond d'un Gtk.InfoBar en jaune?

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; 
} 

Capture:

Screenshot with the problem

J'utilise Python 2.7.13 et GTK + 3.22 sur Windows 10 avec toutes les mises à jour installées et via MSYS2 avec toutes les mises à jour installées avec pacman -Syyu.

Répondre

1

De l'Python Gtk API:

Gtk.InfoBar a un seul nœud CSS avec le nom Infobar. Le nœud peut obtenir l'une des classes de style .info, .warning, .error ou .question, en fonction du type de message.

Par défaut, le type de message est Gtk.InfoBar Gtk.MessageType.INFO et votre fichier style.css doit être, par exemple .:

infobar.info { 
    background-color: yellow; 
} 

De cette façon, vous pouvez être plus spécifique au type de message vous définissez mais infobar par lui-même travaillera également. L'avantage est que vous pouvez avoir des paramètres personnalisés pour chaque type de message en utilisant infobar.<messagetype>.

EDIT:

changer le widget qui recevra la classe css à l'instance Gtk.InfoBar:

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

EDIT 2:

Pour ajouter un CssProvider (StyleProvider) dans son ensemble à l'application, vous avez la méthode de classe Gdk.Screen Gdk.Screen.add_provider_for_screen (plus info here)

Changer votre code pour refléter ces changements, vous aurez:

# 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() 
+0

J'ai testé cette tehnique. Ça ne marche pas. – silviubogan

+0

@silviubogan Désolé, j'ai oublié de mettre le widget. Vérifiez l'édition. –

+0

Ça marche! Mais je veux avoir un fichier CSS global pour l'ensemble de mon programme. Comment puis-je faire cela si la technique expliquée par vous est d'associer pour chaque widget que je veux styler un fichier CSS entier? – silviubogan