#经过两天的学习和调试,总结出以下一段可运行的动态更新数据源的虚拟列表,在此记录一下自己的成长,也方便有需要的人 DongYongFeng 2021-7-17
#!/usr/bin/python
#-*- encoding:UTF-8 -*-
import wx
import sys, glob, random
import random
class data:
columns = ["Name","Ding"]
rows = [
['Noel', 'Louise'],
['Martin', 'Justine'],
['Antoine', 'Eloise'],
['Jenifer', 'Marguerite'],
['Marc', 'Sophie'],
['Etienne', 'Edith'],
['Jhon', 'Doe']]
obj1 = data
obj1.rows = [
['Noel', 'Louise'],
['Martin', 'Justine']]
class VirtualListCtrl(wx.ListCtrl):#1 声明虚列表
"""
A generic virtual listctrl that fetches data from a DataSource.
"""
def __init__(self, parent, dataSource):
wx.ListCtrl.__init__(self, parent,
style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VIRTUAL)#使用wx.LC_VIRTUAL标记创建虚列表
self.dataSource = dataSource
#self.Bind(wx.EVT_LIST_CACHE_HINT, self.DoCacheItems)
self.SetItemCount(len(dataSource.rows))#设置列表的大小
columns = dataSource.columns
for col, text in enumerate(columns):
self.InsertColumn(col, text)
def DoCacheItems(self, evt):
self.dataSource.UpdateCache(
evt.GetCacheFrom(), evt.GetCacheTo())
def OnGetItemText(self, item, col):#得到需求时的文本
data = self.dataSource.rows[item]
return data[col]
def OnGetItemAttr(self, item): return None
def OnGetItemImage(self, item): return -1
class DemoFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1,
"Virtual wx.ListCtrl",
size=(600,400))
self.list = VirtualListCtrl(self, obj1)
self.btn1_addProject = wx.Button(self, label="更新数据", pos=(350, 315), size=(60, 30))
self.btn1_addProject.Bind(wx.EVT_BUTTON, self.onClickBtn1_addProject)
def onClickBtn1_addProject(self,evt):
randNum = random.randint(1,3)
print("randNum = ",randNum)
obj1.columns = [str(randNum),"Ding","Name","4"]*randNum
obj1.rows = [
['l', 'Louise',"Ding","Name"]*randNum,
['2',"Ding","Name", 'Justine']*randNum,
['3', 'Eloise',"Ding","Name"]*randNum,
['4',"Ding","Name", 'Marguerite']*randNum]*randNum
self.list.ClearAll()
columns = obj1.columns
for col, text in enumerate(columns):
self.list.InsertColumn(col, text)
self.list.SetItemCount(len(data.rows))
app = wx.PySimpleApp()
frame = DemoFrame()
frame.Show()
app.MainLoop()