如何复制窗口小部件的GTK样式并将其应用于另一个?

时间:2013-12-10 22:29:09

标签: css gtk themes

我目前的GTK弹出窗口看起来像这样 - 请注意它采用黑暗的氛围颜色主题。

pic

在GTK3.8及更高版本中有GTKMenuButtons - 弹出窗口看起来像这样 - 请注意它看起来像使用按钮样式提示。

pic

我喜欢这种风格,我希望我的应用程序弹出窗口看起来一样,所以有更好的外观 - 整合和感觉。

我知道我可以使用这段python代码覆盖弹出窗口的背景颜色:

style = button.get_style_context()
color = style.get_background_color(Gtk.StateFlags.NORMAL)
popup_menu.override_background_color(Gtk.StateFlags.NORMAL, color)

如果我应用按钮背景颜色,它看起来像这样。

pic

我不知道如何将按钮字体颜色应用于弹出窗口。

更重要的是,有一个恼人的黑色边框 - 1px宽?

因此,对于我的问题 - 我是否尝试了正确的方法(覆盖主题属性)或者我可以以某种方式将一个小部件的CSS样式(按钮或按钮弹出窗口)应用于弹出窗口,以便我可以模仿menubutton popup样式?

更多信息 - GTKMenuButton源gtkmenubutton.c没有弹出窗口的任何主题控件,因此我不知道menubutton popup如何获得它的主题。

2 个答案:

答案 0 :(得分:1)

经过进一步调查后,我发现窗口小部件(或容器)的样式类会影响嵌入对象的整体样式。

让我用一个例子进一步解释:

构建网格并附加包含弹出菜单的MenuButton。

将工具栏StyleClass添加到网格会影响该网格中的所有对象,包括弹出窗口。

style = grid.get_style_context()
style.add_class(Gtk.STYLE_CLASS_TOOLBAR)

结果如下:

Imgur


from gi.repository import Gtk

class MenuExampleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Menu Example")

        self.set_default_size(200, 200)

        grid = Gtk.Grid()
        grid.insert_column(0)

        menu = Gtk.Menu()
        mitem1 = Gtk.MenuItem(label = "Item 1")
        mitem2 = Gtk.MenuItem(label = "Item 2")


        menub = Gtk.MenuButton(label='menu')
        menub.set_popup(menu)
        menub.set_align_widget(None)
        menub.show_all()

        menu.append(mitem1)
        menu.append(mitem2)
        menu.attach_to_widget(menub, None)
        menu.show_all()

        style = grid.get_style_context()
        style.add_class(Gtk.STYLE_CLASS_TOOLBAR)


        grid.attach(menub, 0,0,1,1)
        self.add(grid)

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

答案 1 :(得分:0)

假设您使用gtk3 +

gtk_widget_get_style / gtk_widget_get_modifier_stylegtk_widget_set_style / gtk_widget_modify_style应该做你想做的事。请注意,应用哪种样式有一个内置优先级,您无法修改(请参阅上述函数的DocBook条目)