2017-09-01 6 views
0

TraitsUIを使用して任意のコレクションの内容をリストするためにListEditorを調整するにはどうすればよいですか?私はコメントアウトコードを使用することによりSortedListWithKeyと標準リストを交換する場合はここでのサンプルコードTraitsUI ListEditorファクトリを任意のコレクションに使用する

from traits.api import HasStrictTraits, Instance, Int, List, Str 
from traitsui.api import View, Item, ListEditor, InstanceEditor 

from sortedcontainers import SortedListWithKey 

class Person(HasStrictTraits): 
    name = Str 
    age = Int 

class Office(HasStrictTraits): 
    # employees = Instance(SortedListWithKey, 
          kw={'key': lambda employee: employee.age}) 
    employees = List 

employee_view = View(
    Item(name='name', show_label=False, style='readonly') 
) 

office_view = View(
    Item(name='adults', 
     show_label=False, 
     style='readonly', 
     editor=ListEditor(
      style='custom', 
      editor=InstanceEditor(view=employee_view), 
     ), 
    ), 
    resizable=True 
) 

employee_list = [Person(name='John', age=31), Person(name='Mike', age=31), 
       Person(name='Jill', age=37), Person(name='Eric', age=28)] 

#office = Office() 
#office.employees.update(employee_list) 
office = Office(employees=employee_list) 

office.configure_traits(view=office_view) 

ですが、私は「はAttributeError: 『を得るオフィス値『』エラー』オブジェクトが属性を持っていません」。どうすれば解決できますか?

答えて

1

形質はListトレイトに保存されている何のためのlistサブクラス(TraitListObject)を使用しています。これは、形質イベントがリスト内の項目の変更にだけでなく、属性に発射することを可能にするものです。私はSortedListWithKeyクラスが「ソートされたコンテナ」のサードパーティパッケージから来ていると推測しているので、特性リストではありません。 ListEditorは、リストアイテムが変更されたかどうかを知る必要があるため、TraitsListObject(または同様のもの)が正しく機能することを期待しています。私は考えることができる

修正/回避策:

  1. 2つのListの特性を使用して、1ソートされていない2を同期すると、ソート1、および持っている特性の変化ハンドラ(Setすることができました)。このようなパターンは、順序付けされていないデータが「モデル」レイヤーの一部であり、ソートされた方法がユーザー向きの「ビュー」レイヤーまたは「プレゼンテーション」レイヤーの一部である場合にうまく機能します(TraitsUI ControllerまたはModelViewオブジェクト)。

  2. セルフソート動作がSortedListWithKeyTraitListObjectのサブクラスを作成します。通常のListの特性を使用しますが、サブクラスのインスタンスをそのサブクラスに割り当てるか、実際に滑らかなビヘイビアサブクラスListを使用して、任意のセット操作で新しいサブクラスに変換します。

  3. は、通常のList形質を使用しますが、nameageの列とTableEditor:これは、あなたが意図しているものとは異なるUIで、あなたの現実世界が何であるか合わないかもしれませんが、TableEditorを設定することができます列の自動ソート。さらに簡単な例として、ListStrEditorが動作するかもしれません。

  4. TraitsUI ListEditorに機能を追加して、オプションでリスト項目を並べ替え順序で表示することができます。これはおそらく最も難しいオプションです。

これは明らかに最も洗練されていない解決策ですが、ほとんどの場合、最初の方法と同じです。また、この質問をETS-Usersグループに投稿することを検討して、他の誰かがそれについて考えているかどうかを確認することもできます。

+0

私の場合、並べ替えはビューだけでなく、ビジネスロジックの一部です。そしてあなたが正しいです、 'SortedListWithKey'は「ソートされたコンテナ」パッケージからのものです。 – MindV0rtex

関連する問題