繁体   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