如何在wxPython中使用命名颜色?

6

我这样获取wx中的命名颜色:

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

尽管 "ORANGE" 存在于 wx.lib.colourdb 中,但我不能将网格单元格的颜色设置为 wx.ORANGE,因为它会提示:

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

我该如何使用wx.lib.colourdb.getColourList()中定义的颜色?
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")

谢谢,但有些颜色不起作用,比如“PEACHPUFF2”,“LIGHTCORAL”。它们会变成白色。可能是什么问题? - alwbtc
谢谢您先生。虽然更新colorbdb以添加更多颜色似乎很傻,但为什么这些颜色不是默认添加的呢? - alwbtc
我认为他们只是默认添加了最常见的。 - Joran Beasley

2

我也在学习如何使用颜色数据库,偶然发现了这个帖子,在寻找提示和示例时。现在你知道我对这个主题不是专家,但我会分享我到目前为止所发现的。

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

  2. 我也遇到了颜色全是白色的问题,但我尝试通过在for循环中递增索引来访问颜色。我正在编写一个应用程序,制作2D饼图,试图为画布刷子分配颜色,以便用不同的颜色填充饼扇区。我使用列表中的前6种颜色(用于6个扇区的饼),发现整个饼都是白色的。最后,我查看了颜色列表(DuHHH!),找到了问题......前7个或更多的颜色都只是略微不同的白色调,非常相似,以至于它们看起来是完全相同的颜色。

我发现了这个“所有东西都是白色”的问题的2种不同解决方案。第一种解决方案涉及使用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]))

上述语句选择每个第十种颜色,这意味着第一个部分始终是白色,而其他部分将是其他各种颜色。
在我的旧电脑上,对列表进行洗牌大约需要2秒钟,但速度很慢。每次运行应用程序时,扇区的颜色都与上一次运行时不同。这可能是可取的,也可能不是,这取决于应用程序的预期目的。
我希望应用程序每次运行时扇区的颜色都保持相同,因为最终用户想要将特定颜色与特定数据集相关联。出于这个原因,我使用第二种方法。它更快,但如果索引乘数像上面的例子中那样为10,则会将应用程序限制为63种颜色。我想我可以稍微修改一下循环,并在每第六次迭代时更改乘数之类的东西,但63种颜色对我来说已经足够了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接