6

wx我以这种方式命名颜色:

import wx.lib.colourdb as wb
wb.getColourList()

虽然“橙色”在 中wx.lib.colourdb,但我无法将网格单元格的颜色设置为,wx.ORANGE因为它说:

AttributeError: 'module' object has no attribute 'ORANGE'

如何使用中定义的颜色wx.lib.colourdb.getColourList()

4

2 回答 2

6
color = wx.NamedColour("orange")

some_window.SetForegroundColour("orange") 

(确保您首先启动您的应用程序)

为了将一些颜色加载到wx.TheColourDatabase你需要运行

wx.lib.colourdb.updateColourDB()  #adds ALOT more named colours to wx.TheColourDatabase
c1 = wx.NamedColour("light coral")
c2 = wx.NamedColour("peachpuff2")
于 2013-09-12T18:27:54.907 回答
2

我也只是在学习如何使用颜色数据库,并在四处寻找提示和示例时遇到了这个线程。所以现在你知道我不是这个话题的专家,但我会分享我到目前为止发现的东西。

  1. 我认为您不需要执行wx.lib.colourdb.updateColourDB()。我不使用它,对我来说,数据库似乎已经被填充了。在我的带有 wxPy 2.8.? 的 Ubuntu 12.04 系统上,数据库在没有该命令的情况下被初始化为 630 种颜色。如果使用 wx.lib.colourdb.updateColourDB() 命令然后计算颜色,我仍然只能得到 630 种颜色。如果我打印颜色名称列表,无论我是否发出 wx.lib.colourdb.updateColourDB() 命令,该列表似乎都具有相同的颜色。

  2. 我也遇到了颜色全白的问题,但我试图通过在 for 循环中增加索引来访问颜色。我正在编写一个制作 2D 饼图的应用程序,它试图为画布画笔分配颜色,以便用不同的颜色填充饼区。我使用了列表中的前 6 种颜色(对于 6 扇区饼图),发现整个饼图都是白色的。最终,我查看了颜色列表(DuHHH!)并发现了问题……前 7 种左右的颜色都是略有不同的白色阴影,彼此非常相似,它们看起来是完全相同的颜色。

对于这个“一切都是白色的”问题,我发现了两种不同的解决方案。第一个解决方案涉及使用 Python 的 random.shuffle(sequence) 打乱颜色列表。

    import wx
    from random import shuffle, seed
    from wx.lib.colourdb import getColourList

    class MyFrame(wx.Frame):
            def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title, size=(1000, 1000))

            # COMMENT 1  wx.lib.colourdb.updateColourDB()

            i = 0
            self.colors = []
            for c in getColourList():
                print c,
                self.colors.append(c)
                print self.colors[i]
                i += 1
            print 'Counted', i, 'colors'
            seed()                           # seed the randomizer
            shuffle(self.colors)    
            exit()

首先尝试上述类似的操作,先保留第一个评论,然后再取消评论。我想你会发现在 for 循环中打印的列表在这两种情况下都是完全相同的。

在我的应用程序中,我运行一个循环来在 wx.PaintDC 上绘制饼图扇区。根据我是否对颜色列表进行洗牌,我可以采用 2 种不同的方式。洗牌会在整个列表中随机分布白色(ish)颜色,因此所有扇区都填充有不同的颜色。这是代码的相关部分。

    dc = wx.PaintDC(self.panel)
    for i in range(sector_count):
        dc.SetBrush(wx.Brush(self.colors[i]))
        DrawNextPieSector(dc)

我发现的另一个解决方案是打乱颜色列表,而是将循环索引乘以画笔分配中的常数,如下所示。

        dc.SetBrush(wx.Brush(self.colors[i * 10]))

上面的语句选择每 10 个颜色,这意味着第一个扇区将始终为白色,但其他扇区将是各种其他颜色。

在我的旧电脑上洗牌大约需要 2 秒,但速度很慢。每次应用程序运行时,扇区的颜色都与上次运行时不同。这可能是可取的,也可能不是,取决于应用程序应该做什么。

我希望每次应用程序运行时扇区都具有相同的颜色,因为最终用户希望将特定颜色与特定数据集相关联。出于这个原因,我使用第二种方法。它更快,但如果索引乘数为 10,如上例所示,它将应用程序限制为 63 种颜色。我想我可以稍微修改一下循环并在每 6 次迭代或类似的情况下更改乘数,但 63 种颜色对我来说就足够了。

于 2013-09-20T14:07:53.197 回答