+-
TraitsUI:一款python的轻松制作用户界面GUI

1 说明:

=====

1.1 TraitsUI是一套创建在Traits库基础上的用户界面库。

1.2 系统将会使用TraitsUI自动生成一个界面,以供用户交互式地修改对象的trait属性。

1.3 以traits为基础、以Model-View-Controller为设计思想的TraitUI库就是实现这一理想的最佳伴侣。

1.4 TraitsUI——轻松制作用户界面:在开发科学计算程序时,我们希望快速实现一个够用的界面,让用户能够交互式的处理数据,而又不希望在界面制作上花费过多的精力。

1.5 Traits库:为python的属性增加了类型定义的功能,除此之外他还提供了5个特殊的功能:

初始化:每个traits属性都有自己的默认值。

验证:是traits属性有明确的类型定义,只有满足定义的值时才能给它赋值。

代理:traits属性值可以代理给其他对象实例的属性。

监听:是为了当traits属性发生变化时,可以运行事先指定的函数。

可视化:是拥有traits属性的对象,可以方便的生成可以编辑traits属性的界面。

...

2 准备:

=====

2.1 官网:

https://github.com/enthought/traitsui https://docs.enthought.com/traitsui/

2.2 安装:

pip install traits

3 Helloworld:

==========

3.1 代码:

from traits.api import HasTraits from traitsui.api import View, VGroup,Label #定义helloworld类 class Helloworld(HasTraits): traits_view = View( #VGroup=HGroup VGroup( Label(label='Helloworld=你好世界-1'), Label('Helloworld=你好世界-2'), #等同与上面 #只能放在下面,但是显示却在上面 #label='Helloworld=你好世界-3', ), #窗口大小,标题名,按钮设置; width=1000, height=1000, title='Helloworld', buttons=['OK'], #Ok按钮 resizable=True, #窗口大小可调节设置 ) #实例化 demo = Helloworld() if __name__ == '__main__': #可视化demo:那么直接调用其configure_traits方法,系统将会使用TraitsUI自动生成一个界面 demo.configure_traits()

3.2 图:

...

4 代码:

from traits.api import HasTraits,Delegate,Instance,Int,Str class 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 = p c.last_name #可视化 c.configure_traits()

图:

...

5 visible_when:

===========

5.1 代码:

from traits.api import HasTraits, Str, Range, Bool, Enum from traitsui.api import Item, Group, View, Label class 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, Int class 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, Instance from traitsui.api import Item, View, TreeEditor, TreeNode class 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, Code from traitsui.api import Item, Group, View class 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的布局===

自己整理并分享出来。

喜欢的人,请点赞、关注、评论、转发和收藏。