我正在使用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)
有关如何更好地解决这个问题的任何信息?