[英]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.