簡體   English   中英

在特質工廠使用方法特質

[英]using a method trait in a traitsui factory

我試圖弄清楚Method特征如何工作,以及是否可以在特征視圖對象中定義的工廠中使用它,以便將動態值傳遞給工廠。

這就是我的意思,除了工廠行為(運行,但使用工廠會導致崩潰)之外,一個最小的測試用例有效:

from traits.api import HasTraits, Method, Str, List, Instance, method, Int, Any
from traitsui.api import View, Item, TableEditor, ObjectColumn, TextEditor

class Dog(HasTraits):
    name = Str('Fido')
    value = Int(5)

class DogTable(HasTraits):

    def factory(self):
        return Dog(value=self.current_user_value)    

    dog_factory = Method(factory)

    dogs = List(Instance(Dog))
    current_user_value = Int(3)

    def _dogs_default(self):
        return [
            Dog(name='Joe', value=6),
            Dog(name='Ted', value=2),
        ]

    traits_view = View(
        Item('dogs',
            editor=TableEditor( columns =
                [
                ObjectColumn(label='name', editor=TextEditor(), name='name'),
                ObjectColumn(label='value', editor=TextEditor(), name='value'),
                ],
               row_factory = dog_factory,
            )
        ),
        Item('current_user_value'),
        height=300, width=300,
    )

DogTable().configure_traits()

因此,我在這里要做的是設置工廠,以便用戶可以將新項目添加到表中,其中包含用戶當前在GUI中指定的任何值作為初始value

有什么辦法可以做到這一點? 我以為使用Method特質可以通過引用bound方法來解決此問題,並允許我在此實例中實際調用bound方法,但是似乎Method的語義與Callable並無不同。 而且,除了通過惡意使用eval或全局變量( factory_row_args拒絕動態參數)之外,我無法找到任何動態地向工廠提供參數的方法。

昨天我很累,今天我想到了一種顯而易見的方法:

def dog_factory(self):
    return Dog(value=self.current_user_value)

def view_getter(self):
    return  View(
        Item('dogs',
            editor=TableEditor( columns =
                [
                ObjectColumn(label='name', editor=TextEditor(), name='name'),
                ObjectColumn(label='value', editor=TextEditor(), name='value'),
                ],  
               row_factory = self.dog_factory
            )
        ),
        Item('current_user_value'),
        height=300, width=300,
    )

def configure_traits(self):
    super(DogTable, self).configure_traits(view=self.view_getter())

暫無
暫無

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

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