为什么CSS样式在GtkButton上不起作用?

5

请原谅我的英语。

我正在尝试使用css文件更改GtkButton的背景颜色,但我无法做到。 我尝试了在网上找到的一些示例,但都没有起作用。 我发布两个示例。一个是Python 3.2.3,另一个是C 我正在使用Gtk+ 3.6和Kubuntu 12.10。

这是其中一个示例的代码:

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(label='ok')
        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) # With the others GTK_STYLE_PROVIDER_PRIORITY values get the same result.

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

以及style.css

GtkEntry.invalid {
    background-color: #ffaaaa;
    background: #ffaaaa;
}

GtkButton {
    engine: oxygen-gtk; /*tried also with 'none' and without setting engine*/
    background-color: green;
    background: green;
}

这些条目的背景颜色改变得很好...但按钮没有变化,也没有错误信息。

编辑3:(删除之前的编辑并更改了一些标签)总结一下...我尝试使用在网上找到的所有Python、C和C++代码来更改按钮颜色,但都没有成功。我阅读了所有我找到的教程和GTK+ 3参考手册。在那之后,我所知道的是问题出在Kubuntu主题上:如果我将GTK主题从'oxygen-gtk'更改为'default'(在GTK配置中),这是我发现的唯一一个代码正常工作的方法,但这不是我的初衷,而且按钮看起来很难看。

因此,问题是:

  1. 为什么我无法更改按钮的背景颜色?
  2. 为什么只有按钮会出现这个问题?(其他小部件都正常工作)
  3. 我在这里和GTK论坛上得到答案,说更改按钮颜色不是一个好习惯,但是...如果我想要像这张图片中的菜单一样(链接)(看红框按钮)怎么办?最佳实践是什么?

谢谢和问候!

3个回答

5

我知道这个问题已经很老了,但它出现在谷歌搜索结果的前几页,所以我想分享一下我的经验。

Gtk.Button有一个内联的Gtk.Label用于按钮文本,它默认情况下不会从按钮继承,因此您必须明确告诉它(或者只在其中指定颜色):

GtkButton GtkLabel {
    color: #fff; /* This changes the text color in the button */
}

根据@sciamp的回答,GTK主题设置了背景和边框图像,因此您需要手动使用background-image: none; border-image: none;来删除它。希望这能帮助到有需要的人。

2
这应该可以工作(我的意思是它对我有效!):
GtkButton {
  border-image: none;
  background-image: none;
  background-color: green;
}

请解释以便用户更好地理解。 - Kundan
对我来说没有用,我不得不使用“button”而不是“GtkButton”。然而,它也绘制了关闭窗口的“X”按钮,所以我不得不使用button.get_style_context().add_class("foo")button.foo选择器在style.css中。 - Slazer
对我来说,CSS样式是(使用gtk-rs用于GTK 3):“button.foo label”。是的,在“foo”和“label”之间有一个空格,以表明标签是父按钮的后代。 - Jan Diederich

1

这很复杂,但我认为直接做不到。

我相信核心原因是按钮没有渲染背景。它只是在其区域周围呈现一个框架,然后呈现其中的任何子元素。请记住,GtkButton是一个容器,通常包含用于文本标签的GtkLabel,但可以包含任何小部件。

我已成功更改了文本标签的背景颜色,但那时只影响了文本本身周围更紧密的框,这不是您想要的。

间接解决方案是子类化GtkButton以创建一个实际上会渲染其背景的变体。当然,这对主题来说相当粗鲁,应该避免使用。


感谢您的帮助!那么,如果这是一个相当粗鲁的想法,开发人员在想要创建个性化GUI时该怎么做?最佳实践是使用GTK3来创建像这个链接中的菜单一样的菜单吗?(请参见红框中的按钮) - Vanesa Milagros Fernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接