Ok... here is the class:<br>SocketRecordVault is a trellis.Set<br><br>class LumberjackWidget(trellis.Component):<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; trellis.values(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; records = None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filtered_records = None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sorted_records = None,<br>
&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def __init__(self, parent):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.Panel.__init__(self, parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trellis.Component.__init__(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.records = SocketRecordVault()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.filtered_records = trellis.Set()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sorted_records = collections.SortedSet(data=self.filtered_records)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sorted_records.sort_key = lambda x: x.created<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.txt = wx.TextCtrl(self, style=wx.TE_MULTILINE)<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; box = wx.BoxSizer()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; box.Add(self.txt, 1, wx.EXPAND)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.SetSizer(box)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.fmt = logging.Formatter(&#39;%(levelname)s | %(name)s | %(message)s [@ %(asctime)s in %(filename)s:%(lineno)d]&#39;)<br>
<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; @trellis.observer<br>&nbsp;&nbsp;&nbsp; def updateView(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = len(self.records) # needed to monitor changes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.filtered_records = [x for x in self.records]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.sorted_records:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.txt.Clear()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for r in self.sorted_records:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.txt.AppendText(self.fmt.format(r)+&quot;\n<br><br>the traceback is:<br><br>Traceback (most recent call last):<br>&nbsp; File &quot;lumberjack.py&quot;, line 141, in &lt;module&gt;<br>
&nbsp;&nbsp;&nbsp; main()<br>&nbsp; File &quot;lumberjack.py&quot;, line 133, in main<br>&nbsp;&nbsp;&nbsp; panel = LumberjackWidget(frame)<br>&nbsp; File &quot;c:\python25\lib\site-packages\DecoratorTools-1.7-py2.5.egg\peak\util\decorators.py&quot;, line 634, in __call__<br>
&nbsp;&nbsp;&nbsp; return cls.__class_call__.im_func(cls, *args, **kw)<br>&nbsp; File &quot;&lt;peak.events.trellis.wrap wrapping peak.events.trellis.__class_call__ at 0x01BB4770&gt;&quot;, line 5, in __class_call__<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\stm.py&quot;, line 466, in atomically<br>
&nbsp;&nbsp;&nbsp; return super(Controller,self).atomically(self._process, func, args, kw)<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\stm.py&quot;, line 186, in atomically<br>&nbsp;&nbsp;&nbsp; self.cleanup(*sys.exc_info())<br>
&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\stm.py&quot;, line 309, in cleanup<br>&nbsp;&nbsp;&nbsp; return super(Controller, self).cleanup(*args)<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\stm.py&quot;, line 182, in atomically<br>
&nbsp;&nbsp;&nbsp; retval = func(*args, **kw)<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\stm.py&quot;, line 482, in _process<br>&nbsp;&nbsp;&nbsp; self.run_rule(listener)<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\stm.py&quot;, line 359, in run_rule<br>
&nbsp;&nbsp;&nbsp; listener.run()<br>&nbsp; File &quot;lumberjack.py&quot;, line 124, in updateView<br>&nbsp;&nbsp;&nbsp; self.filtered_records = [x for x in self.records]<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\trellis.py&quot;, line 615, in __set__<br>
&nbsp;&nbsp;&nbsp; cell.value = value<br>&nbsp; File &quot;C:\Python25\lib\site-packages\trellis-0.6a1-py2.5.egg\peak\events\trellis.py&quot;, line 144, in set_value<br>&nbsp;&nbsp;&nbsp; raise InputConflict(self._value, value) #self._set_by) #, value, ctrl.current_listener) # XXX<br>
peak.events.trellis.InputConflict: (Set([]), [])<br><br><div class="gmail_quote">On Wed, Apr 16, 2008 at 9:32 PM, Phillip J. Eby &lt;<a href="mailto:pje@telecommunity.com">pje@telecommunity.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">At 08:06 PM 4/16/2008 +0300, Peter Damoc wrote:<br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="Ih2E3d">
Hi Phillip,<br>
<br>
I tried a naive<br>
<br></div>
fitered_records = [r for r in records if &quot;some segment&quot; in &lt;<a href="http://r.name" target="_blank">http://r.name</a>&gt;<a href="http://r.name" target="_blank">r.name</a>]<div class="Ih2E3d"><br>
<br>
It didn&#39;t work :)<br>
I get:<br>
peak.events.trellis.InputConflict: (Set([]), [])<br>
</div></blockquote>
<br>
You&#39;ve left out any information that would help me know what the heck is going on with this bit. &nbsp;Like the traceback, and the code. &nbsp;:)<div class="Ih2E3d"><br>
<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
as for changes, here is the code:<br>
<br>
 &nbsp; &nbsp;@trellis.observer<br>
 &nbsp; &nbsp;def updateView(self):<br>
 &nbsp; &nbsp; &nbsp; &nbsp;x = len(self.records) # needed to monitor changes<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if self.sorted_records:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.txt.Clear()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for r in self.sorted_records:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.txt.AppendText(self.fmt.format(r)+&quot;\n&quot;)<br>
<br>
if I remove the first line in the method the observer no longer gets triggered.<br>
In all cases the only thing that changes are new record being added to the records set.<br>
</blockquote>
<br></div>
Ah... &nbsp;you need to be using &#39;self.sorted_records.changes&#39; in order to detect changes in a SortedSet, currently. &nbsp;Really, that&#39;s what SortedSet is for, to produce a position-based change log.<br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br>There is NO FATE, we are the creators.