4

请原谅我的英语。

我正在尝试使用 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;
}

条目效果很好...... bg 颜色变化。但是按钮没有,也没有错误信息。

EDIT3:(删除预览编辑和更改一些标签) 总结...我试图用我在网上找到的所有 Python、C 和 C++ 代码更改按钮颜色,但未成功。我阅读了我找到的所有教程和 GTK+ 3 参考手册。之后我所知道的就是问题出在 Kubuntu 主题上:如果我将 GTK 主题从“oxygen-gtk”更改为“默认”(在 GTK 配置中),这是我发现代码运行良好的唯一方法,但是这不是想法,按钮看起来很糟糕。

所以,问题是:

  1. 为什么我不能更改按钮的背景颜色?
  2. 为什么我只有按钮才有这个问题?(适用于其他小部件)
  3. 我在这里和 GTK 论坛中得到答案,说这不是更改按钮颜色的好习惯,但是......如果我想要一个像这张图片(链接)中的菜单(见红色框按钮)怎么办?最好的做法是什么?

谢谢和问候!

4

3 回答 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;Hope 手动将其删除,这样可以节省一些人的麻烦。

于 2015-07-11T21:42:10.143 回答
2

这应该有效(我的意思是它对我有用!):

GtkButton {
  border-image: none;
  background-image: none;
  background-color: green;
}
于 2013-09-09T08:29:05.793 回答
1

这很复杂,但我认为不能直接完成。

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

我已经设法改变了文本标签的背景颜色,但是只有文本本身周围更窄的框才会受到影响,这不是你想要的。

间接解决方案是将 GtkButton 子类化以创建一个实际渲染其背景的变体。可以肯定的是,这对主题非常粗鲁,应该避免。

于 2013-02-22T14:54:30.563 回答