如何更改wxpython CustomTreeCtrl中所选项目的选择颜色

0 投票
2 回答
1418 浏览
提问于 2025-04-16 05:53

我正在使用wxpython的CustumTreeCtrl。因为我树形结构中的一些项目需要有不同的文字颜色,所以如果这些项目在被选中时也能保持它们的文字颜色,那就太好了。然而,当一个项目被选中时,背景颜色会自动变成蓝色(这个可以通过SetHilightFocusColour()来控制),而且文字的颜色也会变成白色。但在我的情况下,我不想让它变成白色。有没有办法在选中状态下改变项目的文字颜色?SetItemTextColour()只会设置未选中项目的文字颜色……

谢谢。

2 个回答

0

试试从这个链接下载最新的代码:http://svn.wxwidgets.org/svn/wx/wxPython/3rdParty/AGW/agw/customtreectrl.py,可能已经修复了问题。

0

你是在用Mac吗?我在一个很长的PaintItem方法里找到了这段代码:

        if wx.Platform == "__WXMAC__" and item.IsSelected() and self._hasFocus:
            dc.SetTextForeground(wx.WHITE)
        dc.DrawLabel(item.GetText(), textrect)

我不能确定其他平台的情况,但看起来它是使用系统的默认设置。

所以看起来唯一的办法就是修改这个类,添加一个内部的高亮前景色,或者创建一个子类并重写OnPaintItem方法(可惜这需要复制粘贴很多代码)。

编辑

一个简单的解决办法是在__init__方法里加上这个:

    self.highlight_fgc = wx.WHITE

然后在OnPaintItem方法里,你需要在方法最后的dc.DrawLabel调用之前加上这段代码:

    dc.SetTextForeground(self.highlight_fgc)

最后,在你自己的代码里,你可以设置高亮前景色:

    self.tree.highlight_fgc = wx.RED # etc...

或者如果你想让每个项目都有自己的颜色,你可以修改这个项目(是不是有个“SetItemData”方法或者类似的东西)来保存颜色,然后这样做:

    dc.SetTextForeground(item.GetItemData()) # or whatever...

撰写回答