簡體   English   中英

使用TraitsUI ListEditor Factory進行任意集合

[英]Using TraitsUI ListEditor Factory for arbitrary collections

如何使用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)

如果我使用注釋掉的代碼將標准列表替換為SortedListWithKey,則會得到“ AttributeError:'Office'對象沒有屬性'value'錯誤。 我該如何解決?

特性對存儲在List特征中的任何東西都使用list子類( TraitListObject ):這是允許對列表中的項目以及屬性的更改觸發特征事件。 我猜想SortedListWithKey類來自“ Sorted Containers”第三方程序包,因此不是Traits列表。 ListEditor希望TraitsListObject (或類似工具)能夠正常工作,因為它需要知道列表項是否已更改。

我能想到的修正/解決方法:

  1. 使用兩個List特征,一個未排序(可以是Set )和一個已排序,並具有特征更改處理程序以使兩者同步。 這種模式的效果很好,如果你的無序的數據是“模型”層,它的排序方式的部分是面向用戶的“查看”或“提供”層(即可能在TraitsUI的一部分ControllerModelView對象)。

  2. 編寫一個TraitListObject的子類,該子類具有SortedListWithKey的自排序行為。 使用常規的List特質,但將子類的實例分配給它,或者對於行為異常的子類List進行精巧的行為,即可在任何設置操作上轉換為新的子類。

  3. 使用常規的List特性,但使用帶有nameage列的TableEditor :這與您想要的用戶界面不同,並且可能不適合您的實際情況,但是可以將TableEditor設置為在列。 對於更簡單的示例, ListStrEditor也可以工作。

  4. 向TraitsUI ListEditor添加功能,以便可以按排序順序顯示列表項。 這可能是最困難的選擇。

雖然這顯然是最不優雅的解決方案,但在大多數情況下,我可能只會采用第一個。 您也可以考慮將此問題發布到ETS-Users組中,以查看是否有人對此有任何想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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