我有一个wxListCtrl,我希望与数据结构保持同步。用户将能够添加,删除和修改框架上其他控件的数据,我希望列表在结构时更新。在这里使用的最佳范例是什么?
我正在考虑的一个想法是实现wxListCtrls绘制事件方法,但我关注效率,跟踪所选项目会很痛苦。
现在我已经创建了一个“updateTable”方法,只要数据结构被修改,我就会调用它。如果我不重新设计,我很确定我会创建一个无限循环。
我想我可以传递一个函数对象..
提前致谢。
答案 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;因为你可以做一些事情,比如将相关数据保存在一起,但却隐藏在最终用户之外。