[英]How to synchronize with wxListCtrl
我有一个wxListCtrl,希望与数据结构保持同步。 用户将能够从框架上的其他控件添加,删除和修改数据,我希望列表在结构执行时进行更新。 在这里使用的最佳范例是什么?
我正在考虑的一个想法是实现wxListCtrls绘制事件方法,但是我担心效率,因此跟踪所选项目将很痛苦。
现在,我创建了一个“ updateTable”方法,并且只要数据结构被修改,我就立即调用它。 我很确定,如果不重新设计,我将创建一个无限循环。
我想我可以传递一个函数对象。
提前致谢。
您可能可以使用虚拟列表控件执行此操作。 wxPython演示有一个示例。 我以前没有尝试过。 我个人使用ObjectListView,它是ListCtrl顶部的包装。 我发现它更容易使用。 您可以在本文中看到我的操作方法: http : //www.blog.pythonlibrary.org/2011/11/10/wxpython-and-sqlalchemy-an-intro-to-mvc-and-crud/
这是我目前的解决方案。 对不起,我来晚了。
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
更改为属性以在幕后进行更多操作。
您可以拥有比列更宽的内容(因此[[name, email_address, id], ...]
的二维列表,并且只有["Name", "email address"]
),它仍然有效很好,这也很好,因为您可以执行以下操作:将相关数据保持在一起,但对最终用户隐藏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.