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()
?
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()
?
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")
我也只是在学习如何使用颜色数据库,并在四处寻找提示和示例时遇到了这个线程。所以现在你知道我不是这个话题的专家,但我会分享我到目前为止发现的东西。
我认为您不需要执行wx.lib.colourdb.updateColourDB()。我不使用它,对我来说,数据库似乎已经被填充了。在我的带有 wxPy 2.8.? 的 Ubuntu 12.04 系统上,数据库在没有该命令的情况下被初始化为 630 种颜色。如果使用 wx.lib.colourdb.updateColourDB() 命令然后计算颜色,我仍然只能得到 630 种颜色。如果我打印颜色名称列表,无论我是否发出 wx.lib.colourdb.updateColourDB() 命令,该列表似乎都具有相同的颜色。
我也遇到了颜色全白的问题,但我试图通过在 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 种颜色对我来说就足够了。