dv1 is a DataViewListCtrl with TextColumn. Select any row in dv1 on the top. Selected texts are then rendered white.
dv2 is a DataViewListCtrl where the column renderer is MyRenderer. Select any row in dv2 on the bottom. Selected texts (marked with (*)
) are then rendered black.
But they should have behave the same, as MyRenderer.Render()
are basically transpiled from wxDataViewTextRenderer::Render()
.
Does anyone know where’s going wrong?
Thanks in advance.
import wx
import wx.dataview
class MyRenderer(wx.dataview.DataViewCustomRenderer):
def __init__(self):
super().__init__()
self.text = None
def SetValue(self, value):
self.text = value
return True
def GetValue(self):
return self.text
def GetSize(self):
return wx.DefaultSize
def Render(self, cell, dc, state):
text = self.text or ''
if state & wx.dataview.DATAVIEW_CELL_SELECTED:
text += "(*)"
self.RenderText(text, 0, cell, dc, state)
return True
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None)
self.panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
self.dv1 = wx.dataview.DataViewListCtrl(self.panel)
sizer.Add(self.dv1, wx.SizerFlags(1).Expand())
self.dv2 = wx.dataview.DataViewListCtrl(self.panel)
sizer.Add(self.dv2, wx.SizerFlags(1).Expand())
self.panel.SetSizer(sizer)
self.set_data1()
self.set_data2()
self.Layout()
def set_data1(self):
for i in range(3):
self.dv1.AppendTextColumn(f"col{i}")
for i in range(5):
self.dv1.AppendItem(["x"] * 3)
def set_data2(self):
for i in range(3):
self.dv2.AppendColumn(wx.dataview.DataViewColumn(f"col{i}", MyRenderer(), i))
for i in range(5):
self.dv2.AppendItem(["y"] * 3)
class MyApp(wx.App):
def OnInit(self):
self.frame = MyFrame()
self.SetTopWindow(self.frame)
self.frame.Show()
# self.frame.set_data1()
# self.frame.set_data2()
return True
app = MyApp()
app.MainLoop()