如何为嵌套的 class 实例制定视图?
How are views to be formulated for nested class instances?
我正在尝试为 class 创建一个包含其他 class 实例的用户界面。这是一个说明性的例子:
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()
看来我必须在 Contacts._add
方法中使用 kind=modal
在用户输入信息时暂停执行。
典型的用户交互是:
- 单击 Datastore 对话框中的 [Add] 按钮。 个人信息
出现对话框。
- 单击个人信息对话框中的[姓名]按钮。 人名
出现对话框。
问题是:人物姓名对话框无法激活,因为人物信息 有焦点。
如何才能实现所需的行为(给予 人名 焦点)?
谢谢。
example code for demo_group_size.py 在回答不同的用例时,确实展示了如何显示嵌套的 class 实例。
如果您希望不同的视图具有不同的 windows(而不是嵌套视图的一个 window),您还可以将对 person.configure_traits
的调用转换为对person.edit_traits
并传入 Handler
,当 window 关闭时将 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)
)
向处理程序传递对数据存储的引用,并在用户单击时将人员添加到其中 "OK":
class PersonHandler(Handler):
""" Handler class to add a person to a datastore.
"""
datastore = Instance(Datastore)
def close(self, info, is_ok):
if is_ok:
print('adding to datastore')
self.datastore.add(info.object)
else:
print('not added')
return super(PersonHandler, self).close(info, is_ok)
完整代码示例:https://gist.github.com/jvkersch/e72f2fb4ed72b2e9ba8269c6a6a2957a
我正在尝试为 class 创建一个包含其他 class 实例的用户界面。这是一个说明性的例子:
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()
看来我必须在 Contacts._add
方法中使用 kind=modal
在用户输入信息时暂停执行。
典型的用户交互是:
- 单击 Datastore 对话框中的 [Add] 按钮。 个人信息 出现对话框。
- 单击个人信息对话框中的[姓名]按钮。 人名 出现对话框。
问题是:人物姓名对话框无法激活,因为人物信息 有焦点。
如何才能实现所需的行为(给予 人名 焦点)?
谢谢。
example code for demo_group_size.py 在回答不同的用例时,确实展示了如何显示嵌套的 class 实例。
如果您希望不同的视图具有不同的 windows(而不是嵌套视图的一个 window),您还可以将对 person.configure_traits
的调用转换为对person.edit_traits
并传入 Handler
,当 window 关闭时将 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)
)
向处理程序传递对数据存储的引用,并在用户单击时将人员添加到其中 "OK":
class PersonHandler(Handler):
""" Handler class to add a person to a datastore.
"""
datastore = Instance(Datastore)
def close(self, info, is_ok):
if is_ok:
print('adding to datastore')
self.datastore.add(info.object)
else:
print('not added')
return super(PersonHandler, self).close(info, is_ok)
完整代码示例:https://gist.github.com/jvkersch/e72f2fb4ed72b2e9ba8269c6a6a2957a