GTK:如何正确处理颜色

时间:2016-05-16 12:58:03

标签: python gtk gtk3

我正在使用Python 2.7在GTK + 3上编写应用程序。

在此类应用程序的对话框中,向用户显示同一模型的两个视图。当两个列不同时,我想突出显示对话框的一行。一个例子更清楚。模型看起来像这样。

ATTR | OBJ1 | OBJ2 | COLOR 
name | john | mike | red

我希望颜色为红色'约翰和迈克是不同的名字。然后,在树形视图中,我只是将单元格的背景颜色设置为“红色”'如果不同,否则'白色'

听起来很简单,直到我意识到那里有无数的主题。即使有最简单的黑暗主题,这也不行:相等行的背景颜色是白色的,这意味着用户可能甚至看不到这些单词(因为他使用一个黑暗的主题,在深色背景上字体颜色往往是白色的。)

我怎么能这样做?

现在,我这样处理它,但我知道它错了。

    # TODO: FIX THIS
    # this is the wrong way to do it, I'm creating a useless gtk.tree
    # so I can know the user's default color background
    # that not being bad enought, get_background_color is deprecated
    dumpy_tree = Gtk.TreeView()
    style = dumpy_tree.get_style_context()
    self.bg_color = style.get_background_color(Gtk.StateFlags.NORMAL)
    self.bg_color = self.bg_color.to_string()

    def decide_bg():
        """Decides which background should the row have depending on
        the uses default theme (light, dark, or unknown abomination)
        Pretty ugly, but it works"""
        color = self.bg_color.split("(")[1]
        color = color.split(",")
        color1 = int(color[0])
        color2 = int(color[1])
        color3 = int(color[2][:-1:])

        # that weird string formats from rgb to hexa
        default_bg = '#%02x%02x%02x' % (color1, color2, color3)

        if color1 > 200 and color2 > 200 and color3 > 200:
            return "pink" if first_prop != sec_prop else default_bg
        elif color1 < 100 and color2 < 100 and color3 < 100:
            return "darkred" if first_prop != sec_prop else default_bg
        else:
            # if your theme doesn't go for either dark or light
            # just use that color, screw highlights
            return '#%02x%02x%02x' % (color1, color2, color3)

有关如何更好地解决这个问题的任何信息?

0 个答案:

没有答案