为什么CSS样式不适用于GtkButton?
请原谅我的英语。
我正在尝试通过一个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配置中),这是我找到的唯一让代码正常工作的办法,但这并不是我想要的,按钮看起来很糟糕。
所以,问题是:
- 为什么我不能改变按钮的背景颜色?
- 为什么我只在按钮上遇到这个问题?(其他控件都能正常工作)
- 我在这里和GTK论坛上得到的回答说改变按钮颜色不是一个好习惯,但... 如果我想要一个像这个图片中的菜单(链接)(看红框里的按钮)那该怎么办?有什么好的做法吗?
谢谢,问候!
3 个回答
这个问题有点复杂,但我觉得直接解决可能不太行。
我认为主要原因是按钮本身不显示背景。它只是在周围画一个框,然后把里面的内容显示出来。记住,GtkButton其实是一个容器,通常里面放的是GtkLabel来显示文字标签,但也可以放其他任何小部件。
我能改变文本标签的背景颜色,但这样做只会影响到文本周围那个很紧凑的框,这并不是你想要的效果。
间接的解决办法是创建一个GtkButton的子类,让它能够显示背景。这种做法其实对主题来说有点不太友好,所以最好还是避免这样做。
这个应该可以用(我的意思是,它对我来说是有效的!):
GtkButton {
border-image: none;
background-image: none;
background-color: green;
}
我知道这个问题有点老了,但在谷歌搜索结果中排在前面,所以我想分享一下我的经验。
Gtk.Button 这个按钮里面有一个 Gtk.Label 用来显示按钮的文字,但这个文字默认是不会跟按钮一起继承样式的,所以你需要特别告诉它要这样做(或者直接在里面指定颜色):
GtkButton GtkLabel {
color: #fff; /* This changes the text color in the button */
}
关于 @sciamp 的回答,GTK 主题会为背景和边框设置一个图片,所以你需要手动去掉这些图片,方法是用 background-image: none; border-image: none;
。希望这能帮到正在遇到这个问题的人。