ObjectListView(快速) - 仅当相同项目不存在时才添加新项目

时间:2014-01-16 16:04:17

标签: python performance objectlistview

如何确保只有一个条目出现在列表中?如果匹配某些(指定的)列,我想禁用另一个条目。

1 个答案:

答案 0 :(得分:0)

有许多方法可以防止将重复项添加到任何窗口小部件/数据存储中。我偶尔使用的方法是跟踪我已经添加到某些东西的对象,比如ObjectListView小部件,并将它与我想要添加的新对象进行比较。例如,让我们创建一个小的十六进制代码生成器。

import random

used_num = []

def gen_ran_num():
    val = ''.join([random.choice('0123456789ABCDEF') for x in range(6)])
    if val not in used_num:
        used_num.append(val)
        return val

在代码段中创建了一个变量来存储生成的十六进制代码。该函数生成一个十六进制代码,然后检查代码是否已经创建。如果used_num变量中的代码不存在,则附加它然后返回值。

我认为您可以使用类似的东西来防止将重复信息添加到您的ObjectListView。

如果我有时间,我会用更多示例代码编辑我的答案。

<强> - 编辑 - 好的,这是我的建议的简要示例。

import wx
from ObjectListView import FastObjectListView, ColumnDefn

sample_data = (
    {'id': 1, 'days': 5, 'notes': 10},
    {'id': 2, 'days': 3, 'notes': 1},
    {'id': 3, 'days': 5, 'notes': 10},
    {'id': 4, 'days': 7, 'notes': 0},
    {'id': 5, 'days': 1, 'notes': 1},
    {'id': 1, 'days': 5, 'notes': 10},
    {'id': 2, 'days': 3, 'notes': 1},
    {'id': 2, 'days': 3, 'notes': 1},
    {'id': 1, 'days': 5, 'notes': 10},
    {'id': 4, 'days': 7, 'notes': 0},
    {'id': 6, 'days': 2, 'notes': 11}
  )

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
            title='Sample App')
        _pnl = wx.Panel(self, wx.ID_ANY)
        self.dataOLV = FastObjectListView(_pnl, wx.ID_ANY,
                            style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.dataOLV.Hide()
        self.added_to_olv = []
        _sizer = wx.BoxSizer(wx.VERTICAL)
        _sizer.Add(self.dataOLV, 1, wx.ALL|wx.EXPAND, 5)
        _pnl.SetSizerAndFit(_sizer)
        self.SetColumns()
        self.SetData()
        self.Layout()

    def SetColumns(self):
        olvColumns = [
            ColumnDefn('ID',  'left', 155, 'id'),
            ColumnDefn('Issue Length', 'right', 35, 'days'),
            ColumnDefn('# of Notes', 'right', 35, 'notes')
        ]
        self.dataOLV.SetColumns(olvColumns)

    def SetData(self):
        for item in sample_data:
            if item['id'] not in self.added_to_olv:
                self.added_to_olv.append(item['id'])
                self.dataOLV.AddObject(item)
        self.dataOLV.RefreshObjects()
        self.dataOLV.Show()

def RunApp():
    app = wx.App()
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    RunApp()

此示例使用字典存储将在ObjectListView中显示的数据。程序运行时,它会创建FastObjectListView小部件,然后隐藏它,因为它还没有列或数据。然后它运行一个函数来创建列,然后是一个填充和显示小部件的函数。我测试了这个示例应用程序,最多显示100行,并且有不同数量的重复项。它从未显示重复的行。

-Mike S