Цвет виджета PyGObject GTK3 не работает

Недавно я начал использовать pygtk/PyGObject и пытался применить или изменить цвет фона, простую кнопку или любой другой виджет, используя следующую строку кода, полученную от одного из QA здесь.

self.button.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0.0, 1.0, 0.0, 1.0))

Но это не похоже на применение или работу.

Полный образец тестовой программы находится здесь.

#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk


class MyWIndow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)

        self.button = Gtk.Button(label="Click")
        self.button.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0.0, 1.0, 0.0, 1.0))
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        Gtk.main_quit()


win = MyWIndow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

Есть ли что-то, чего мне не хватает? Заранее спасибо.


person Naten Baptista    schedule 30.07.2017    source источник


Ответы (1)


Этот метод использовался в Gtk+ 2.0 и, похоже, также использовался в первых версиях Gtk+ 3.0, но в версии 3.16 он устарел:

Из API Python:

Новое в версии 3.0.

Устарело, начиная с версии 3.16: эта функция бесполезна в контексте рендеринга на основе CSS. Если вы хотите изменить способ рендеринга фона виджета, вы должны использовать пользовательский стиль CSS через специфичный для приложения Gtk.StyleProvider и класс стилей CSS. Вы также можете переопределить отрисовку виджета по умолчанию с помощью сигнала Gtk.Widget::draw и использовать Cairo для отрисовки определенного цвета, независимо от стиля CSS.

Дополнительная информация о Миграция на CSS.

Ваш пример с использованием предопределенных классов css (предлагаемые и деструктивные действия):

#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk


class MyWIndow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)

        self.button = Gtk.Button(label="Click")
        self.button.get_style_context().add_class("suggested-action")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        self.button.get_style_context().add_class("destructive-action")


win = MyWIndow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
person José Fonte    schedule 30.07.2017