class ContentFrame(widgets.ScrollbarCanvasMixin, widgets.BaseFrame): canvas_height = 550 canvas_width = 550 def _init(self): super()._init() self._once_init() def _once_init(self): self.results = FilterableList() self.filter_kwargs = dict() self._queue = queue.Queue() self.rows = 0 def show_results(self, results): """ generate the results :parameter results: instance RawFrame list """ for r in results: self.show_one_result(r) def show_one_result(self, result:RowFrame): result.grid(column=0, row=self.rows) self.rows += 1 def add_new_result(self, result:ResultInfo): row = RowFrame(self.frame, **result.as_dict()) # 检测当前的row是否符合过滤规则 if FilterableList([row]).filter(**self.filter_kwargs): self.show_one_result(row) self.results.append(row) def test(self): for i in range(50): print(i) im = Image.open('gui/images_test/1.png') result = { 'image_url': "http://h.nimingban.com/Public/Upload/image/2015-08-18/55d2bff64c32f.jpg", 'text': 'the'+str(i) + '0123456789'*20, 'link': 'http://www.baidu.com', 'response_num':30, } m = i % 3 if m ==0: result = ResultInfo(**result) elif m==1: result.pop('image_url') result['image_fp'] = im result = ResultInfo(**result) else: result.pop('image_url') result = ResultInfo(**result) self._queue.put(result) self._queue.put(None) def retrieve_result_from_engine(self): import time self.master.progressbar_start() while engine.is_running: result = engine.get_one_result() if result: self._queue.put(result) else: time.sleep(0.5) self._queue.put(None) self.master.progressbar_stop() def communicate_for_get_result(self): while True: try: result = self._queue.get_nowait() if result is None: return self.add_new_result(result) except queue.Empty: break self.after(500, self.communicate_for_get_result) def do_filter(self, **kwargs): """ pass nothing will clear the filter :param kwargs: :return: """ self.filter_kwargs = kwargs results = self.results.all() for key, value in kwargs.items(): results = results.filter(**{key: value}) self.refresh_result_pannel() self.show_results(results) def clear_filter(self): self.do_filter() def refresh_result_pannel(self): for c in self.frame.winfo_children(): c.grid_forget() self.rows = 0 def clear(self): for c in self.frame.winfo_children(): c.destroy() self._once_init()
def _once_init(self): self.results = FilterableList() self.filter_kwargs = dict() self._queue = queue.Queue() self.rows = 0