【问题标题】:How to get the background color of a widget in GTK and Python?如何在 GTK 和 Python 中获取小部件的背景颜色?
【发布时间】:2015-10-16 03:52:19
【问题描述】:

我想获得小部件的正常背景颜色(在本例中为 GtkHeaderBar)。我目前正在使用

style = self.get_titlebar().get_style_context()

获取样式,并且

color = style.get_property("background-color", Gtk.StateFlags.NORMAL)

获取与该样式关联的背景颜色。

但是它返回一个具有以下属性的Gkd.RGBA 对象:

Gdk.RGBA(red=0.000000, green=0.000000, blue=0.000000, alpha=0.000000)

但是如果我打开 GTK Inspector,选择 HeaderBar,然后转到样式属性,它会显示

background-color | rgb(57,63,63) | gtk-contained-dark.css:1568.29

我必须做什么才能获得这些相同的值?

编辑:

我正在尝试GtkStyleContext.render_background(),但没有成功:

surfc = Cairo.ImageSurface (Cairo.FORMAT_ARGB32, 10, 10)
contx = Cairo.Context(surfc)
style = self.get_titlebar().get_style_context()
backg = Gtk.render_background(style, contx, 10, 10, 10, 10)
surfc.write_to_png("test.png")

生成的文件test.pngrgba(0, 0, 0, 0) 图像。

【问题讨论】:

    标签: gtk gtk3 pygobject


    【解决方案1】:

    你应该看看用 css 修改背景颜色。有一个很好的documentation。它可以与python一起使用

    css_provider = Gtk.CssProvider()
    css_provider.load_from_path('application.css')
    Gtk.StyleContext.add_provider_for_screen(
        Gdk.Screen.get_default(),
        css_provider,
        Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
    )
    

    还有一个css文件,比如:

    GtkHeaderbar {
        background-color:@theme_bg_color;
    }
    

    编辑:正如您所评论的,您不想修改背景颜色,而是检索它的值。你可以做widget.get_style_context().get_background_color(),它会返回类似Gdk.RGBA(red=0.913725, green=0.913725, blue=0.913725, alpha=1.000000)的东西。

    但是,您应该注意 get_background_color() 已被弃用,因为没有 一种 背景颜色。一些小部件使用渐变作为背景,因此它不是使用此方法的最佳解决方案。参考documentation

    【讨论】:

    • 对不起,我不想用 css 修改背景颜色。我想获取当前的背景颜色。
    • 是的,我知道get_background_color()。但是它总是返回rgba(0, 0, 0, 0)。可能是因为小部件正在使用渐变...
    • -1,这并不能回答问题,get_background_color() 已被弃用,并且不支持纯色以外的背景,即使不是不常见的情况,也不是这种情况。如今,大多数按钮、条形图甚至窗口背景都显示出渐变功能。
    • 偶然发现这一点非常困难。现在我终于可以用不同的主题颜色来绘制我的小部件了。谢谢。
    【解决方案2】:

    如果有人感兴趣,我认为问题出在此处:

    backg = Gtk.render_background(style, contx, 10, 10, 10, 10)
    

    应该是这样的:

    backg = Gtk.render_background(style, contx, 0, 0, 10, 10)
    

    【讨论】:

    • 这不是主要问题(见我的回答),但这确实是render_background 结果图像大小为零的原因。好收获!
    【解决方案3】:

    您在正确的轨道上,但有一个 issue 具有新的推荐获取颜色的方法。

    recommended workaround 是退回到已弃用的get_background_color()

    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk
    import sys
    
    window = Gtk.Window()
    context = window.get_style_context()
    # this one is buggy
    color1 = context.get_property("background-color", Gtk.StateFlags.NORMAL)
    print(color1)
    # this is the deprecated version, but it is the recommended workaround
    color2 = context.get_background_color(Gtk.StateFlags.NORMAL)
    print(color2)
    

    来自python/Gtk documentation

    请注意,除非样式上下文已使用 Gtk.StyleContext.save() 保存,否则不建议传递 self 的当前状态以外的状态

    所以目前推荐的获取小部件背景颜色的方法是

    context = widget.get_style_context()
    color = context.get_background_color(widget.get_state())
    

    self 通常是一个 Gtk 小部件,这变成了

    context = self.get_style_context()
    color = context.get_background_color(self.get_state())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多