エントリが 1 回だけリストに追加されるようにするにはどうすればよいですか? 一部の(指定された)列に一致する場合、別のエントリが追加されないようにしたい。
1 に答える
ウィジェットやデータ ストレージに重複が追加されるのを防ぐ方法はいくつかあります。私が時々使用する方法は、ObjectListView ウィジェットなど、何かに既に追加したオブジェクトを追跡し、それを追加したい新しいオブジェクトと比較することです。たとえば、小さな 16 進コード ジェネレーターを作成してみましょう。
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
コード スニペットでは、生成された 16 進コードを格納する変数が作成されました。関数は 16 進コードを生成し、コードが既に作成されているかどうかを確認します。コードが used_num 変数にまだ存在しない場合は、それを追加して値を返します。
このようなものを使用して、重複した情報が ObjectListView に追加されるのを防ぐことができると思います。
時間があれば、サンプル コードを追加して回答を編集します。
--編集-- OK、これが私の提案の簡単なサンプルです。
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 行を表示し、さまざまな量の重複を表示してテストしました。重複する行は表示されませんでした。
-マイク・S