Wie kann ich in Python GTK3 mit gi verschiedene Farben für Schaltflächen festlegen?

Mein jüngster Hingucker ist es, mit GTK3 eine dumme kleine App in Python3 zu erstellen, deren Schaltflächen andere Farben als nebelgrau haben. Ich habe die letzten Tage damit verbracht, darüber zu googeln, und bis jetzt ist alles, was ich versucht habe, fehlgeschlagen. Nicht nur gescheitert, sondern gescheitertschweigend, ohne Fehlermeldungen, die mir einen Hinweis darauf geben, was los ist.

Dies ist meine Test-App:

from gi.repository import Gtk, Gdk

class ButtonWindow(Gtk.Window):

    def __init__(self):
        super().__init__(title="Button Test")
        self.set_border_width(10)
        hbox = Gtk.Box(spacing=10)
        self.add(hbox)
        hbox.set_homogeneous(False)

        # make the button
        button = Gtk.Button('Test Button')
        hbox.pack_start(button, True, True, 0)

        # try to change its colour ....

#        button.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
#        button.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0, 1, 0, 1))
#        button.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0x00ff00))
#        button.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("green"))
#        button.modify_bg(Gtk.StateType.ACTIVE, Gdk.color_parse("green"))
#        button.modify_bg(Gtk.StateType.SELECTED, Gdk.color_parse("green"))

        # attempt to change the style ....

#        style = button.get_style().copy()
#        style.bg[Gtk.StateType.NORMAL] = Gdk.color_parse('green')
#        style.bg[Gtk.StateType.ACTIVE] = Gdk.color_parse('red')
#        style.bg[Gtk.StateType.SELECTED] = Gdk.color_parse('blue')
#        style.bg[Gtk.StateType.PRELIGHT] = Gdk.color_parse('black')
#        button.set_style(style)

        # ok, let's try changing the box ....

#        hbox.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
#        hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,1,0,1))
#        hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0x00ff00ff))
#        hbox.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('green'))

window = ButtonWindow()        
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

Ich habe meine fehlgeschlagenen Versuche als Kommentare hinterlassen. Wie oben erwähnt, hat die Anwendung anscheinend funktioniert, da keine der obigen Varianten Fehlermeldungen erzeugt. Jedoch,keiner von ihnen scheinen für mich zu funktionieren, weil die Knöpfe die Farbe von abgestandenem Spülwasser behalten.

Zu Ihrer Information Ich verwende Python 3.2.3 unter Ubuntu 12.04 mit python3-gi und python3-gi-cairo, die aus dem Standard-Repository installiert wurden.

Kann mich bitte jemand in die richtige Richtung weisen?

BEARBEITEN: Das Folgende ist ein überarbeitetes Beispiel, das auf der Antwort von @ mike basiert. Dies funktioniert, aber es gibt einige Probleme, die möglicherweise in einigen Folgefragen behoben werden müssen. Die Themen sind:

Warum tutbackground müssen auf Ubuntu anstelle von verwendet werdenbackground-colorund dann nur für den button?Ich habe immer noch einige Probleme damit, den Schriftstil zum Laufen zu bringen, aber zumindest habe ich jetzt ein funktionierendes Beispiel zum Spielen.Können verschiedene Stile / Farben auf verschiedene Knöpfe angewendet werden, z. aufgrund des Textes oder eines anderen Attributs?

Also, der Code: -

from gi.repository import Gtk, Gdk

class ButtonWindow(Gtk.Window):

    def __init__(self):
        super().__init__(title="Button Test")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=10)
        self.add(hbox)
        hbox.set_homogeneous(False)

        # make the button
        button = Gtk.Button('Test Button')
        hbox.pack_start(button, True, True, 0)

# get the style from the css file and apply it
cssProvider = Gtk.CssProvider()
cssProvider.load_from_path('gtkStyledButtonTest.css')
screen = Gdk.Screen.get_default()
styleContext = Gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider,
                                     Gtk.STYLE_PROVIDER_PRIORITY_USER)

window = ButtonWindow()        
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

und die CSS-Datei sieht so aus: -

GtkWindow {
    background-color: #0000ff;
}

GtkButton {
    color: #ff0000;
    background: #00ff00;
}

Ich hoffe, jemand findet das hilfreich.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage