0

如何确保只有一次出现的条目被添加到列表中?如果与某些(指定的)列匹配,我想禁止添加另一个条目。

4

1 回答 1

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。

当我有时间时,我将使用更多示例代码来编辑我的答案。

--EDIT-- 好的,这是我的建议的简短示例。

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 行,并且重复数量不一。它从未显示重复的行。

-迈克小号

于 2014-02-28T17:11:22.640 回答