Bob*_*ble 5 colors button python-3.x gtk3
我最近的头疼是使用 GTK3 在 Python3 中构建一个愚蠢的小应用程序,按钮上的颜色不是雾灰色。最近几天我一直在谷歌上搜索如何做到这一点,到目前为止我尝试过的一切都失败了。不仅失败了,而且默默地失败了,没有错误消息给我任何关于发生了什么的线索。
这是我的测试应用程序:
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()
我将失败的尝试作为评论。如上所述,就应用程序而言,它似乎有效,因为上述变体都不会产生任何错误消息。然而,它们似乎都不适合我,因为按钮仍然是陈旧的洗碗水的颜色。
仅供参考,我在 Ubuntu 12.04 下使用 Python 3.2.3,并从标准存储库安装了 python3-gi 和 python3-gi-cairo。
有人可以指出我正确的方向吗?
编辑:以下是基于@mike 的答案重新设计的示例。这有效,但存在一些问题,可能会在一些后续问题中解决。问题是:
background必须在 Ubuntu 上使用而不是background-color, 然后只用于按钮?所以,代码:-
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()
并且 css 文件如下所示:-
GtkWindow {
    background-color: #0000ff;
}
GtkButton {
    color: #ff0000;
    background: #00ff00;
}
我希望有人觉得这很有用。
尽管这是一个老问题,但我想添加一个参考问题 3 的答案,仅供参考。
GTK3 添加了样式类的概念。因此,要获得不同颜色的按钮,您可以直接使用名称或将样式类添加到其上下文中。所有这些都在 Mike 在他的回答中提供的链接中进行了解释。
这是一个如何使用样式类突出显示条目中的无效文本的简单示例:
from gi.repository import Gtk, Gdk
class MainWindow(Gtk.Window):
    def __init__(self):
        super().__init__()
        vbox = Gtk.Box(spacing=10,orientation=Gtk.Orientation.VERTICAL)
        self.add(vbox)
        self.entries = [ Gtk.Entry() for i in range(3) ]
        for e in self.entries:
            vbox.pack_start(e, True, True, 0)
            e.connect("changed", self.on_entry_changed)
            e.set_text('123')
        button=Gtk.Button('ok',name='ok-button')
        vbox.pack_end(button,True,True,0)
    def on_entry_changed(self,entry):
        ctx = entry.get_style_context()
        if not entry.get_text().isnumeric():
            ctx.add_class('invalid')
        else:
            ctx.remove_class('invalid')
cssProvider = Gtk.CssProvider()
cssProvider.load_from_path('style.css')
screen = Gdk.Screen.get_default()
styleContext = Gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider,
                                     Gtk.STYLE_PROVIDER_PRIORITY_USER)
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
使用 style.css:
GtkEntry.invalid {
    background-color: #ffaaaa;
    background: #ffaaaa;
}
GtkButton#ok-button {
    background-color: green;
    background: green;
}
GTK3 中的首选方式是使用 CSS 进行样式设置。在 Ubuntu 12.04 下,您可能需要使用 background 而不是 background-color。但是我不懂Python,所以我就给一个链接。
https://thegnomejournal.wordpress.com/2011/03/15/styling-gtk-with-css/