2013-02-20 39 views
4

请原谅我的英语。为什么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; 
} 

的条目效果很好...的背景颜色变化。但按钮不,并且没有错误消息。

EDIT3:(删除预览编辑和改变一些标签) 汇总...我尝试了所有我在网络上找到失败了Python,C和C++代码更改按钮的颜色。我阅读了所有我找到的教程和GTK + 3参考手册。 所有我知道的问题是关于Kubuntu主题:如果我将GTK主题从'oxygen-gtk'更改为'默认'(在GTK配置中),是我发现的唯一方法代码运行良好,但这不是主意,按钮看起来很可怕。

所以,问题是:

  1. 为什么我不能更改按钮的背景颜色?
  2. 为什么我只用按钮来解决这个问题? (适用于其他小工具)
  3. 我在这里和GTK论坛上得到了答案,说这不是一个好的做法来改变按钮的颜色,但是...如果我想要一个像这个图像的菜单(link)(看到红色框按钮)?这是最好的练习吗?

感谢和问候!

回答

1

这很复杂,但我不认为它可以直接完成。

我相信核心原因是因为按钮不渲染背景。它所做的就是在其区域周围渲染框架,然后渲染里面的任何孩子。请记住,GtkButton是一个容器,它通常拥有一个GtkLabel作为文本标签,但可以容纳任何widgetry。

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

间接的解决方案是继承GtkButton以创建一个实际呈现其背景的变体。可以肯定的是,这对于主题非常粗鲁,应该避免。

+0

感谢您的帮助!所以,如果这是一个非常粗鲁的想法,那么当开发人员想要创建个性化GUI时,该如何做?最好的做法是使用GTK3创建一个像[链接]这样的菜单(http://c.fsdn.com/con/app/proj/scrmopenerp/screenshots/ProjetatyScrmOpenerp_2.png)? (请参阅红色框中的按钮) – 2013-02-22 15:22:21

2

这应该工作(我的意思是它为我工作!):

GtkButton { 
    border-image: none; 
    background-image: none; 
    background-color: green; 
} 
+0

请详细解释以便更好地了解用户。 – Shivaay 2013-09-09 08:47:36

+0

也适用于我。 – 2015-03-29 15:17:34

+0

没有为我工作,我不得不使用“按钮”,而不是“GtkButton”。但是,它也绘制了关闭窗口的“X”按钮,所以我不得不在style.css中使用'button.get_style_context()。add_class(“foo”)'和'button.foo'选择器。 – Slazer 2017-08-02 11:01:57

5

我知道这已经很老了,但在前几个谷歌搜索结果中弹出,所以我想我会分享我的经验。

Gtk.Button有按钮上的文字,不从默认按钮继承内嵌Gtk.Label,所以你必须明确地告诉它(或只是指定它的颜色):

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

就@sciamp的回答而言,GTK主题为背景和边框设置了图像,因此您必须手动将其删除。