2017-10-10 40 views
0

对不起,使这个模糊,但我正在写一个Python代码,其中列表中的值被附加到一个wx.Choice框。在这些值中有一些正确的和不正确的,我已经区分了哪些值是正确的,哪些不在我的代码中。我想在wx.Choice中显示这​​些值不正确,因为它们是红色的。我知道有这样的选项,如SetForegroundColour,但是我还没有找到一个合适的方法在wx.Choice之内完成此任务,任何人都有任何想法我可以做到这一点?在wx.Choice中更改列表中特定值的颜色

谢谢!

+0

我相信不可能在wx.Choice中访问单个项目的属性。 – prgDevelop

+0

我认为你是在小部件本身的胆量下降。一旦做出选择,你总是可以选择颜色,虽然这可能不是你以前的样子。这确实会问这个问题,如果它们无效,为什么会包含错误的选择? –

回答

0

还有另一种选择,你可能发现更多的根据自己的喜好,一个BitmapComboBox,这是显示在项目前面的位映射列表的组合框。

import wx 
from wx.adv import BitmapComboBox # Phoenix 
#import wx.combo     # wxpython Classic 
class Myframe(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     pan = wx.Panel(self) 
     valid_list = ["1111","22222","33333","44444"] 
     invalid_list = ["5555","6666","77777","88888"] 
     image = wx.Image("vvalid.png") 
     valid_bmp = wx.BitmapFromImage(image) 
     image = wx.Image("vinvalid.png") 
     invalid_bmp = wx.BitmapFromImage(image) 
     self.combo = BitmapComboBox(pan)   # Phoenix 
     #self.combo = wx.combo.BitmapComboBox(pan) #wxpython Classic 
     for i in valid_list: 
      self.combo.Append(i, bitmap=valid_bmp) 
     for i in invalid_list: 
      self.combo.Append(i, bitmap=invalid_bmp) 
     self.combo.SetSelection(0) 
     self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo) 

    def OnCombo(self, event): 
     print (self.combo.GetStringSelection()) 

if __name__ == "__main__": 
    App = wx.App() 
    Myframe().Show() 
    App.MainLoop() 

enter image description here

我已经包含了两个菲尼克斯和经典WX代码,虽然使用凤凰,你应该只wx.Bitmap取代wx.BitmapFromImage,但它目前让你摆脱旧的形式。

+0

这是一个非常好的解决方案!我不知道你可以在组合框中使用位图!谢谢! – steradian

0

正如您从评论中知道的那样,您尝试做的事似乎并不是一个简单的选择。但是,您可以使用combotreebox并将有效和无效的选择放在树的2个不同分支中。

import wx 
from wx.lib.combotreebox import ComboTreeBox 
class Myframe(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     pan = wx.Panel(self) 
     valid_list = ["1111","22222","33333","44444"] 
     invalid_list = ["5555","6666","77777","88888"] 
     self.combo = ComboTreeBox(pan) 

     Valid = self.combo.Append('Valid Choices') # Add a root item 
     for i in valid_list: 
      self.combo.Append(i, parent=Valid) # Add childen to Valid Choices 

     InValid = self.combo.Append('InValid Choices') # Add a root item 
     for i in invalid_list: 
      self.combo.Append(i, parent=InValid) # Add childen to InValid Choices 
     self.combo.SetSelection(Valid) 

     self.combo.Bind(wx.EVT_COMBOBOX, self.OnCombo) 

    def OnCombo(self, event): 
     print (self.combo.GetStringSelection()) 

if __name__ == "__main__": 
    App = wx.App() 
    Myframe().Show() 
    App.MainLoop() 

enter image description here

+0

感谢您选择这个备选方案。回答你为什么要提出无效值的问题。这是因为在这种情况下,“无效”值意味着它们不等于列表中的其他值。但在某些情况下,不相等的值实际上可能是正确的值,所以我想将值保留在列表中,但表示它与其他值不同。 – steradian

+1

我不确定这是否是放置此评论的适当位置,但我已决定通过在“无效”项旁边放置星号来表示差异,谢谢! – steradian

+0

@steradian简单几乎总是最好的选择 –