簡體   English   中英

如何與wxListCtrl同步

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM