2011-12-19 19 views
0

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

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

今、私は "updateTable"メソッドを作成しました。データ構造が変更されたときはいつでも呼び出すだけです。私が再設計しなければ、無限のループを作るつもりだと私は確信しています。私は関数オブジェクトを渡すことができたと

..事前に

感謝。

答えて

1

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

0

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

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を変更することができます。

2列目の列が[[name, email_address, id], ...]であり、列が["Name", "email address"]であるため、列の幅よりも広い内容を持つことができますが、それでも問題なく動作します。関連性が高いデータは一緒になりますが、エンドユーザーからは隠されています。

関連する問題