如何为嵌套类实例制定视图?

时间:2017-02-13 16:11:35

标签: python-3.x enthought traitsui

我正在尝试为包含其他类的实例的类创建用户界面。这是一个说明性的例子:

from traits.etsconfig.api import ETSConfig
ETSConfig.toolkit = 'qt4'
from   traits.api   import HasTraits, Instance, String
from   traitsui.api import Action, Controller, Item, View

import sys, traits, traitsui
print ('python version   :',sys.version)          # 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)]
print ('traits version   :',traits.__version__)   # 4.6.0
print ('traitsui version :',traitsui.__version__) # 5.1.0

class Name (HasTraits):
    first = String
    last  = String
    view  = View (Item('first'), Item('last'), title='Person Name', buttons=['OK','Cancel'])
    def __str__ (self):
        return '{} {}'.format(self.first,self.last)

class Person (HasTraits):
    name = Instance(Name)
    view = View (Item('name'), title='Person Info', buttons=['OK','Cancel'])
    def __str__ (self):
        return str(self.name)

class Datastore (HasTraits):
    def add (self, person:Person):
        print ('added', person)

class Contacts (Controller):
    add  = Action (name='Add', action='_add')
    view = View (title='Datastore', buttons=[add])

    def _add (self, info):
        person = Person (name=Name())
        save   = person.configure_traits (kind='modal')
        if save:
            self.model.add (person)
        else:
            print ('user canceled ADD action')

datastore  = Datastore()
controller = Contacts (model=datastore)
controller.configure_traits()

在用户输入信息时,我似乎必须使用kind=modal暂停Contacts._add方法中的执行。

典型的用户互动是:

  1. 点击 数据存储区 对话框中的[添加]按钮。 人员信息 对话框出现。
  2. 点击 人员信息 对话框中的[名称]按钮。 人名 对话框出现。
  3. 问题是: 人名 对话框无法激活,因为 人物信息 具有焦点。< / p>

    如何实现所需的行为(给予人名焦点)?

    感谢。

2 个答案:

答案 0 :(得分:0)

example code for demo_group_size.py虽然它回答了不同的用例,却展示了如何显示嵌套的类实例。

答案 1 :(得分:0)

如果您希望为不同的视图设置不同的窗口(而不是一个带有嵌套视图的窗口),您也可以调用person.configure_traits来调用person.edit_traits并传入{ {1}}在窗口关闭时将Handler实例添加到数据存储区。

更具体地说,我将您的控制器更改为

Person

处理程序传递对数据存储的引用,并在用户单击“确定”时将该人添加到该数据存储中:

class Contacts (Controller):
    add  = Action (name='Add', action='_add')
    view = View (title='Datastore', buttons=[add])

    def _add (self, info):
        person = Person (name=Name())
        person.edit_traits(
            handler=PersonHandler(datastore=self.model)
        )

完整代码示例:https://gist.github.com/jvkersch/e72f2fb4ed72b2e9ba8269c6a6a2957a