为什么CSS样式不适用于GtkButton?

5 投票
3 回答
6331 浏览
提问于 2025-04-17 16:30

请原谅我的英语。

我正在尝试通过一个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 个回答

1

这个问题有点复杂,但我觉得直接解决可能不太行。

我认为主要原因是按钮本身不显示背景。它只是在周围画一个框,然后把里面的内容显示出来。记住,GtkButton其实是一个容器,通常里面放的是GtkLabel来显示文字标签,但也可以放其他任何小部件。

我能改变文本标签的背景颜色,但这样做只会影响到文本周围那个很紧凑的框,这并不是你想要的效果。

间接的解决办法是创建一个GtkButton的子类,让它能够显示背景。这种做法其实对主题来说有点不太友好,所以最好还是避免这样做。

2

这个应该可以用(我的意思是,它对我来说是有效的!):

GtkButton {
  border-image: none;
  background-image: none;
  background-color: green;
}
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;。希望这能帮到正在遇到这个问题的人。

撰写回答