天天看点

wxpython virtualListCtrl 动态更新数据源 2021-07-17

#经过两天的学习和调试,总结出以下一段可运行的动态更新数据源的虚拟列表,在此记录一下自己的成长,也方便有需要的人 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()