如何与wxListCtrl同步

时间:2011-12-19 01:19:45

标签: wxpython

我有一个wxListCtrl,我希望与数据结构保持同步。用户将能够添加,删除和修改框架上其他控件的数据,我希望列表在结构时更新。在这里使用的最佳范例是什么?

我正在考虑的一个想法是实现wxListCtrls绘制事件方法,但我关注效率,跟踪所选项目会很痛苦。

现在我已经创建了一个“updateTable”方法,只要数据结构被修改,我就会调用它。如果我不重新设计,我很确定我会创建一个无限循环。

我想我可以传递一个函数对象..

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用虚拟列表控件执行此操作。 wxPython演示有一个例子。我之前没有尝试过。就个人而言,我使用ObjectListView,它是ListCtrl之上的包装器。我发现它更容易使用。您可以在本文中看到我的工作方式:http://www.blog.pythonlibrary.org/2011/11/10/wxpython-and-sqlalchemy-an-intro-to-mvc-and-crud/

答案 1 :(得分:0)

这是我目前的解决方案。对不起,我有点晚了。

STD_LOGIC

用户可以通过将新集合传递到class custom_virtual_list(wx.ListCtrl): def __init__(self, parent, columns = None, contents = None, autoscroll = False): columns = [] if columns == None else columns contents = [] if contents == None else contents super(custom_virtual_list, self).__init__(parent, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_REPORT | wx.LC_VIRTUAL) self.columns = columns self.contents = contents self.autoscroll = autoscroll self.update_columns() self._update_count() def get_selections(self): sels = [] sel = self.GetFirstSelected() while sel != -1: sels.append(sel) sel = self.GetNextSelected(sel) return(sels) def update_contents(self, new_contents = None): if not new_contents == None: self.contents = new_contents self._update_count() def OnGetItemText(self, item, col): return(self.contents[item][col]) def update_columns(self, columns = None): if not columns == None: self.columns = columns self.DeleteAllColumns() for i, column in enumerate(self.columns): self.InsertColumn(i, column) self._resize() def _update_count(self): self.SetItemCount(len(self.contents)) self._resize() self.Refresh() if self.autoscroll: self.EnsureVisible(self.GetItemCount() - 1) def _resize(self): for i, column in enumerate(self.columns): self.SetColumnWidth(i, wx.LIST_AUTOSIZE_USEHEADER) 来更新内容,也可以将update_contents()更改为属性,以便在幕后进行更多操作。

你可以拥有比列数更广的内容(所以contents的第2个列表,只有列[[name, email_address, id], ...]),它仍然可以正常工作,这很好,&# 39;因为你可以做一些事情,比如将相关数据保存在一起,但却隐藏在最终用户之外。