2010-10-21 144 views
2

我有一個wxpython網格,我正在改變單元格的背景顏色以顯示它發生了什麼。淡入/淡出wxpython網格單元格的背景顏色

我想淡入/淡出顏色變化(如瀏覽器中的JavaScript),以獲得更流暢的外觀。這可能嗎?

現在,我只是改變背景顏色,然後在1.5秒間隔後將其更改回來。

def do_stuf(self): 
    # ... stuff ... 
    wx.CallAfter(self.HighlightCell, row, col) 

def HighlightCell(self, row, col): 
    self.grid.Table.highlight = (row, col) 
    self.grid.ForceRefresh() 
    wx.CallLater(1500, self.ClearCellHighlight) 

def ClearCellHighlight(self): 
    self.grid.Table.highlight = None 
    self.grid.ForceRefresh() 

然後在虛擬表,我檢查,如果電池需要突出:

def GetAttr(self, row, col, kind): 
    """ 
    Use this callback to set the cell's background color 
    """ 
    attr = wx.grid.GridCellAttr() 
    if (row, col) == self.highlight: 
     attr.SetBackgroundColour("green") 
    elif row % 2: 
     attr.SetBackgroundColour("white") 
    else: 
     attr.SetBackgroundColour("#e7ffff") 

    return attr 

另外,有一個漂亮的方式來表明一個單元格的內容有哪些變化?

回答

4

這是我前段時間做的事情,以獲得一個ListCtrl與刪除時淡出的項目。將代碼保存到fade.py並運行它以查看演示。不應該太難以適應Grid。

import wx 

class FadeMixin(object): 
    ''' FadeMixin provides one public method: DeleteItem. It is meant to 
    be mixed in with a ListCtrl to 'fade out' items before they are 
    really deleted. Mixin like this: 

    Assumption: the background colour of the control is wx.WHITE 

    class MyListCtrl(FadeMixin, wx.ListCtrl): 
     ... 
    ''' 
    def __init__(self, *args, **kwargs): 
     self.__bgColour = wx.WHITE 
     super(FadeMixin, self).__init__(*args, **kwargs) 

    def DeleteItem(self, index, fadeStep=10, fadeSpeed=50): 
     if self.IsEnabled(): 
      self.__startDeleteItem(index) 
     fgColour, bgColour, transparentColour = self.__getColours(index) 
     if fgColour == bgColour == transparentColour: 
      self.__finishDeleteItem(index) 
     else: 
      for colour, setColour in [(fgColour, self.SetItemTextColour), 
             (bgColour, self.SetItemBackgroundColour)]: 
       fadedColour = self.__fadeColour(colour, transparentColour, 
               fadeStep) 
       setColour(index, fadedColour) 
      wx.FutureCall(50, self.DeleteItem, index, fadeStep, fadeSpeed) 

    def SetBackgroundColour(self, colour): 
     self.__bgColour = colour 
     super(FadeMixin, self).SetBackgroundColour(colour) 

    def GetBackgroundColour(self): 
     return self.__bgColour 

    def __startDeleteItem(self, index): 
     # Prevent user input during deletion. Things could get messy if 
     # the user deletes another item when we're still busy fading out the 
     # first one: 
     self.Disable() 
     # Unselect the item that is to be deleted to make the fading visible: 
     currentState = self.GetItemState(index, wx.LIST_STATE_SELECTED) 
     self.SetItemState(index, ~currentState, wx.LIST_STATE_SELECTED) 

    def __finishDeleteItem(self, index): 
     super(FadeMixin, self).DeleteItem(index) 
     self.Enable() 

    def __getColours(self, index): 
     fgColour = self.GetItemTextColour(index) 
     bgColour = self.GetItemBackgroundColour(index) 
     transparentColour = self.GetBackgroundColour() 
     if not bgColour: 
      bgColour = transparentColour 
     return fgColour, bgColour, transparentColour 

    def __fadeColour(self, colour, transparentColour, fadeStep): 
     newColour = [] 
     for GetIntensity in wx.Colour.Red, wx.Colour.Green, wx.Colour.Blue: 
      currentIntensity = GetIntensity(colour) 
      transparentIntensity = GetIntensity(transparentColour) 
      if currentIntensity < transparentIntensity: 
       newIntensity = min(transparentIntensity, 
            currentIntensity + fadeStep) 
      elif currentIntensity > transparentIntensity: 
       newIntensity = max(transparentIntensity, 
           currentIntensity - fadeStep) 
      else: 
       newIntensity = transparentIntensity 
      newColour.append(newIntensity) 
     return wx.Colour(*newColour) 


class ListCtrl(FadeMixin, wx.ListCtrl): 
    pass 


class Frame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     super(Frame, self).__init__(*args, **kwargs) 
     self.list = ListCtrl(self, style=wx.LC_REPORT) 
     self.list.InsertColumn(0, 'Column 0') 
     self.list.InsertColumn(1, 'Column 1') 
     self.fillList() 
     self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onSelected) 
     self.Bind(wx.EVT_LIST_DELETE_ITEM, self.onDeleted) 

    def onSelected(self, event): 
     self.list.DeleteItem(event.GetIndex()) 

    def onDeleted(self, event): 
     if self.list.GetItemCount() == 1: 
      wx.CallAfter(self.fillList, False) 

    def fillList(self, firstTime=True): 
     for row in range(10): 
      self.list.InsertStringItem(row, 'Item %d, Column 0'%row) 
      self.list.SetStringItem(row, 1, 'Item %d, Column 1'%row) 
     self.list.SetItemBackgroundColour(1, wx.BLUE) 
     self.list.SetItemTextColour(2, wx.BLUE) 
     self.list.SetItemBackgroundColour(3, wx.GREEN) 
     self.list.SetItemTextColour(4, wx.GREEN) 
     self.list.SetItemBackgroundColour(5, wx.RED) 
     self.list.SetItemTextColour(6, wx.RED) 
     self.list.SetItemBackgroundColour(7, wx.BLACK) 
     self.list.SetItemTextColour(7, wx.WHITE) 
     self.list.SetItemBackgroundColour(8, wx.WHITE) 
     self.list.SetItemTextColour(8, wx.BLACK) 
     if not firstTime: 
      self.list.SetBackgroundColour(wx.BLUE) 


app = wx.App(False) 
frame = Frame(None, title='Select an item to fade it out') 
frame.Show() 
app.MainLoop() 
1

據我所知,您只能在框架小部件上設置透明度並查看其對所有孩子的影響。我不記得爲什麼設置單個小部件的透明度不起作用。無論如何,一個體面的方法來模擬這樣的事情將是使用一個wx.Timer循環一個顏色的不同陰影列表,然後當迭代完成時,將其重置爲正常的顏色。這應該足以模擬外觀。