Hi there,
I am using wxpython 4.2.4 with pythpon 3.14 on windows. I plan to convince my company to use wxpython for rapid prototyping of advanced GUIs.
Right now, I am struggeling with getting a DataViewListCtrl to have an editable column that shows colors. I can show the colors by using a ColorRenderer derived from DataViewCustomRenderer, but I can’t get the cells to be editable. The ActivateCell function in my renderer is not getting called, though I have instantiated my renderer with the mode dv.DATAVIEW_CELL_EDITABLE, and also provided a custom variantType.
What am I doing wrong? Here is my code:
import wx
import wx.dataview as dv
class DataApp(wx.App):
def __init__(self):
wx.App.__init__(self)
frame = wx.Frame(None, id=wx.ID_ANY, title="Data frame")
panel = wx.Panel(frame, id = wx.ID_ANY)
sizer = wx.FlexGridSizer(1, wx.Size(6,6))
model = dv.DataViewListStore()
view = dv.DataViewListCtrl(panel)
view.AppendTextColumn("First name",0)
view.AppendTextColumn("Last name",1)
view.AppendColumn(dv.DataViewColumn("Age",NumberRenderer(),2))
view.AppendColumn(dv.DataViewColumn("Color",ColorRenderer(),3), "color")
view.AssociateModel(model)
model.AppendItem(["John","Doered",20,'#ff0000'])
model.AppendItem(["Jane","Doegreen",21,'#00ff00'])
model.AppendItem(["Jim","Doeblue","33",'#0000ff'])
sizer.AddGrowableCol(0, proportion=1)
sizer.AddGrowableRow(0, proportion=1)
sizer.Add(view, flag = wx.ALL | wx.EXPAND, border=6)
panel.SetSizerAndFit(sizer)
frame.Show()
class ColorRenderer(dv.DataViewCustomRenderer):
def __init__(self):
super().__init__(mode = dv.DATAVIEW_CELL_EDITABLE)
self.size = wx.Size(16,16)
def GetSize(self):
return self.size;
def IsCompatibleVariantType(self, variant):
return variant in ("string", "color")
def SetValue(self, value):
print("Setting value to " + value)
self.value = value;
return True
def ActivateCell(self, cell, model, item, col, mouseEvent):
print(f"Cell activated in column {col} with value: {self.value}")
return True # Prevent default editing
def Render(self, cell, dc, state):
hexString = self.value
dc.SetBrush(wx.Brush(wx.Colour(hexString),wx.BRUSHSTYLE_SOLID))
dc.DrawRectangle(cell)
return True
class NumberRenderer(dv.DataViewTextRenderer):
def __init__(self):
super().__init__()
def IsCompatibleVariantType(self, variant):
return variant in ("long", "double", "datetime", "string")
if __name__ == "__main__":
app = DataApp()
app.MainLoop()