wxpython:如何用指定的RGB颜色填充listctrl对象内的复选框?

0 投票
2 回答
766 浏览
提问于 2025-04-16 14:17

我有一个图表,这个图表里有很多国家。我想在一个列表控件里创建一些图例,并通过改变一个没有实际功能的复选框的颜色来实现。

有没有什么wxpython的函数可以用来改变这样的属性呢?

谢谢!

2 个回答

0

看看wx演示中的wxRendererNative(),你应该能在OnPaint事件中使用一个DC(设备上下文),然后用你选择的图像替换掉渲染出来的图像,比如换成一个不同颜色的复选框。你需要自己制作这些图像,或者想办法用你喜欢的颜色来遮盖默认的图像(我自己没试过),但总的来说,这应该是可以实现的。

你还可以查看这个链接:http://wiki.wxpython.org/CreatingCustomControls,里面有一个自定义复选框控件的例子。我不太确定这个在列表中怎么应用,但这可能会给你一些关于如何实现自定义复选框的思路。

0

我觉得复选框可能不太适合这个需求。改变背景颜色在不同的平台上效果会不一样,而且我不确定有没有哪个平台只改变控件的框部分。ListCtrl的功能也比较有限。

如果没有现成的解决方案,你可以试试用ScrolledPanel和StaticText来实现:

import wx.lib.scrolledpanel as sp

SAMPLE_DATA = [('Antarctica',   'Green'),
               ('Afghanistan',  'Maroon'),
               ('Belguim',      'Blue'),
               ('Canada',       'Red'),
               ('India',        'Sea Green'),
               ('Mexico',       'Grey'),
               ('Mongolia',     'Black'),
               ('New Zealand',  'Orange'),
               ('Turkey',       'Purple'),]

class Legend(sp.ScrolledPanel):
    def __init__(self, parent, id, data=SAMPLE_DATA):
        sp.ScrolledPanel.__init__(self, parent, id)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        for d in data:
            item  = d[0]
            color = d[1]

            linesizer = wx.BoxSizer(wx.HORIZONTAL)
            box = wx.StaticText(self, wx.ID_ANY, ' ', size=(10,10))
            box.SetBackgroundColour(color)
            text = wx.StaticText(self, wx.ID_ANY, item)
            linesizer.Add(box,  0, flag=wx.EXPAND|wx.ALL, border=2)
            linesizer.Add(text, 1, flag=wx.EXPAND)
            self.sizer.Add(linesizer, 0, wx.EXPAND)

        self.SetSizer(self.sizer)
        self.sizer.Fit(self)
        self.SetupScrolling(scroll_y=True)

撰写回答