wxListCtrlと同期する方法

私はwxListCtrlを持っていますが、データ構造と同期しています。ユーザーは、フレーム上の他のコントロールからデータを追加、削除、変更することができます。構造体が更新されるたびにリストを更新します。ここで使用する最良のパラダイムは何ですか?

私が考えていた1つのアイデアは、wxListCtrlsペイントイベントメソッドを実装することでしたが、私は効率に関心があり、選択したアイテムを追跡するのは苦痛になります。

今、私は "updateTable"メソッドを作成しました。データ構造が変更されたときはいつでもそれを呼び出します。私が再設計しなければ、無限のループを作り出すだろうと私は確信しています。

私は関数オブジェクトを渡すことができると思います..

前もって感謝します。

0

2 答え

あなたはおそらく仮想リストコントロールでこれを行うことができます。 wxPythonのデモには例があります。私は前にそれを試していない。個人的には、ListCtrlの上にあるラッパーであるObjectListViewを使用します。私はそれを使用するほうがずっと簡単です。この記事で私がどのようにしているかを見ることができます: http://www.blog.pythonlibrary.org/2011/11/10/wxpython-and-sqlalchemy-an-intro-to-mvc-and-crud/

1
追加された

これは私の現在の解決策です。申し訳ありませんが少し遅れています。

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]、...] の2番目のリストと ["Name"、 "電子メールアドレス "] )、それでも正常に動作します。なぜなら、関連するデータをまとめて、エンドユーザーから隠されるようなことができるからです。

0
追加された