2014-01-16 35 views

回答

0

有很多方法可以防止將重複項添加到任何小部件/數據存儲中。我偶爾使用的方法是跟蹤我已經添加到某個對象的對象,比如ObjectListView小部件,並將其與我想要添加的新對象進行比較。例如,讓我們創建一個十六進制的小代碼生成器。

import random 

used_num = [] 

def gen_ran_num(): 
    val = ''.join([random.choice('ABCDEF') 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行,並顯示不同數量的重複項。它從未顯示重複的行。

-Mike S

相關問題