1 说明:
=====
1.1 TraitsUI是一套基于Traits库的用户界面库。
1.2系统将使用TraitsUI自动生成一个界面,供用户交互修改对象的trait属性。
1.3基于traits,用模型-视图-控制器设计的TraitUI库是实现这一理想的最佳伴侣。
1.4TraitsUI-making用户界面轻松:在开发科学计算程序时,我们希望快速实现一个足够的界面,让用户可以交互地处理数据,但我们不想在界面制作上花费太多精力。
1.5Traits库:在python的属性中增加了类型定义的功能,除此之外,他还提供了五个特殊的功能:
初始化:中的每个特征属性都有自己的默认值。
验证:'s特征属性有明确的类型定义,只有满足定义的值才能赋值。
代理:特征的属性值可以委托给其他对象实例的属性。
监听:用于在traits属性改变时运行预先指定的函数。
可视化:是一个具有特征属性的对象,可以很容易地生成一个编辑特征属性的界面。
2 准备:
=====
2.1官方网站:
3359 github . com/ent think/traitsu 3359 docs . ent think . com/traitsu/2.2安装:
3 Helloworld:pip安装特征
==========
3.1代码:
从traits.api导入hastraits从traitsui.api导入视图,VGroup,Label#定义helloworld类类Hello World(hastraits): traits _ View=View(# v group=h group(Label(Label=' Hello World=Hello World-1 ')),Label('Helloworld=Hello World -2 '),#同上#只能放在下面,但显示在# Label=' Hello World=Hello World-3 ',),#窗口大小,标题Width=1000,height=1000,title=' Hello World ',buttons=['OK'],# OK button resizable=True,#窗口大小可调整)# instantiation demo=Hello World()if _ _ name _=' _ main _ _ ' 3360 #可视化演示:然后直接调用其configure_traits方法,系统会自动生成一个带有TraitsUI的接口demo.configure _ traits()。图3.2:
4代码:
从traits.api导入HasTraits,Delegate,Instance,Int
,Strclass Parent(HasTraits): #初始化 last_name = Str("张") #初始化class Child(HasTraits): age = Int #验证 father = Instance(Parent) #定义了father属性是Parent的实例,而此时father的默认属性是None #代理 last_name = Delegate('father') #通过Delagate为child对象创建了代理属性last_name,代理功能将使得c.last_name和c.father.last_name始终保持相同的值 #监听 def _age_changed(self,old,new): print("Age change from %s to %s"%(old,new))p = Parent() #实例化对象c = Child()#正确c.father = pc.last_name#可视化c.configure_traits()图:
5 visible_when:
===========
5.1 代码:
from traits.api import HasTraits, Str, Range, Bool, Enumfrom traitsui.api import Item, Group, View, Labelclass Person(HasTraits): first_name = Str() last_name = Str() age = Range(0, 120) legal_guardian = Str() school = Str() grade = Range(1, 12) marital_status = Enum('single', 'married', 'divorced', 'widowed') registered_voter = Bool(False) military_service = Bool(False) gen_group = Group( Item(name='first_name'), Item(name='last_name'), Item(name='age'), label='General Info', show_border=True ) child_group = Group( Item(name='legal_guardian'), Item(name='school'), Item(name='grade'), label='Additional Info for minors', show_border=True, visible_when='age < 18', ) adult_group = Group( Item(name='marital_status'), Item(name='registered_voter'), Item(name='military_service'), label='Additional Info for adults', show_border=True, visible_when='age >= 18', ) view = View( Group( gen_group, '10', Label("Using 'visible_when':"), '10', child_group, adult_group ), title='Personal Information', resizable=True, buttons=['OK'] )demo = Person( first_name="Samuel", last_name="Johnson", age=16)if __name__ == '__main__': demo.configure_traits()
5.2 图:
6 login:
======
6.1 超级简单的登录框,代码:
from traits.api import HasTraits, Str, Intclass ModelManager(HasTraits): model_name = Str #字符串 category = Str #字符串 model_file = Str #字符串 model_number = Int #数值if __name__ == "__main__": model = ModelManager() model.configure_traits()
6.2 图:
7 treeeditor:
=========
7.1 代码:
from traits.api import HasTraits, Str, Regex, List, Instancefrom traitsui.api import Item, View, TreeEditor, TreeNodeclass Employee(HasTraits): #name = Str('<unknown>') name = Str() title = Str() phone = Regex(regex=r'\d\d\d-\d\d\d\d') def default_title(self): self.title = 'Senior Engineer'class Department(HasTraits): name = Str('<unknown>') employees = List(Employee)class Company(HasTraits): name = Str('<unknown>') departments = List(Department) employees = List(Employee)no_view = View()tree_editor = TreeEditor( nodes=[ TreeNode( node_for=[Company], auto_open=True, children='', label='name', view=View(['name']) ), TreeNode( node_for=[Company], auto_open=True, children='departments', label='=Departments', # constant label view=no_view, add=[Department], ), TreeNode( node_for=[Company], auto_open=True, children='employees', label='=Employees', # constant label view=no_view, add=[Employee] ), TreeNode( node_for=[Department], auto_open=True, children='employees', label='name', # label with Department name view=View(['name']), add=[Employee] ), TreeNode( node_for=[Employee], auto_open=True, label='name', # label with Employee name view=View(['name', 'title', 'phone']) ) ])class Partner(HasTraits): name = Str('<unknown>') company = Instance(Company) traits_view = View( Item(name='company', editor=tree_editor, show_label=False), title='Company Structure', buttons=['OK'], resizable=True, style='custom', width=.3, height=500 )jason = Employee(name='Jason', title='Senior Engineer', phone='536-1057')mike = Employee(name='Mike', title='Senior Engineer', phone='536-1057')dave = Employee(name='Dave', title='Senior Developer', phone='536-1057')martin = Employee(name='Martin', title='Senior Engineer', phone='536-1057')duncan = Employee(name='Duncan', title='Consultant', phone='526-1057')demo = Partner( name='Enthought, Inc.', company=Company( name='Enthought', employees=[dave, martin, duncan, jason, mike], departments=[ Department( name='Business', employees=[jason, mike] ), Department( name='Scientific', employees=[dave, martin, duncan] ) ] ))if __name__ == '__main__': demo.configure_traits()
7.2 图:
8 codeeditor:
==========
8.1 代码:
from traits.api import HasTraits, Codefrom traitsui.api import Item, Group, Viewclass CodeEditorDemo(HasTraits): code_sample = Code('import sys\n\nsys.print("hello world!")') code_group = Group( Item('code_sample', style='simple', label='Simple'), Item('_'), Item('code_sample', style='custom', label='Custom'), Item('_'), Item('code_sample', style='text', label='Text'), Item('_'), Item('code_sample', style='readonly', label='ReadOnly') ) traits_view = View( code_group, #窗口标题名。大小,按钮ok title='CodeEditor', width=600, height=600, buttons=['OK'] )demo = CodeEditorDemo()if __name__ == "__main__": demo.configure_traits()
8.2 图:
===超级简单,简化GUI的布局===
自己整理并分享出来。
喜欢的人,请点赞、关注、评论、转发和收藏。