1说明: 1。1TraitsUI是一套建立在Traits库基础上的用户界面库。 1。2系统将会使用TraitsUI自动生成一个界面,以供用户交互式地修改对象的trait属性。 1。3以traits为基础、以ModelViewController为设计思想的TraitUI库就是实现这一理想的最佳伴侣。 1。4TraitsUI轻松制作用户界面:在开发科学计算程序时,我们希望快速实现一个够用的界面,让用户能够交互式的处理数据,而又不希望在界面制作上花费过多的精力。 1。5Traits库:为python的属性增加了类型定义的功能,除此之外他还提供了5个特殊的功能: 初始化:每个traits属性都有自己的默认值。 验证:是traits属性有明确的类型定义,只有满足定义的值时才能给它赋值。 代理:traits属性值可以代理给其他对象实例的属性。 监听:是为了当traits属性发生变化时,可以运行事先指定的函数。 可视化:是拥有traits属性的对象,可以方便的生成可以编辑traits属性的界面。 2准备: 2。1官网:https:github。comenthoughttraitsuihttps:docs。enthought。comtraitsui 2。2安装:pipinstalltraits 3Helloworld: 3。1代码:fromtraits。apiimportHasTraitsfromtraitsui。apiimportView,VGroup,Label定义helloworld类classHelloworld(HasTraits):traitsviewView(VGroupHGroupVGroup(Label(labelHelloworld你好世界1),Label(Helloworld你好世界2),等同与上面只能放在下面,但是显示却在上面labelHelloworld你好世界3,),窗口大小,标题名,按钮设置;width1000,height1000,titleHelloworld,buttons〔OK〕,Ok按钮resizableTrue,窗口大小可调节设置)实例化demoHelloworld()ifnamemain:可视化demo:那么直接调用其configuretraits方法,系统将会使用TraitsUI自动生成一个界面demo。configuretraits() 3。2图: 4代码:fromtraits。apiimportHasTraits,Delegate,Instance,Int,StrclassParent(HasTraits):初始化lastnameStr(张)初始化classChild(HasTraits):ageInt验证fatherInstance(Parent)定义了father属性是Parent的实例,而此时father的默认属性是None代理lastnameDelegate(father)通过Delagate为child对象创建了代理属性lastname,代理功能将使得c。lastname和c。father。lastname始终保持相同的值监听defagechanged(self,old,new):print(Agechangefromstos(old,new))pParent()实例化对象cChild()正确c。fatherpc。lastname可视化c。configuretraits() 图: 5visiblewhen: 5。1代码:fromtraits。apiimportHasTraits,Str,Range,Bool,Enumfromtraitsui。apiimportItem,Group,View,LabelclassPerson(HasTraits):firstnameStr()lastnameStr()ageRange(0,120)legalguardianStr()schoolStr()gradeRange(1,12)maritalstatusEnum(single,married,porced,widowed)registeredvoterBool(False)militaryserviceBool(False)gengroupGroup(Item(namefirstname),Item(namelastname),Item(nameage),labelGeneralInfo,showborderTrue)childgroupGroup(Item(namelegalguardian),Item(nameschool),Item(namegrade),labelAdditionalInfoforminors,showborderTrue,visiblewhenage18,)adultgroupGroup(Item(namemaritalstatus),Item(nameregisteredvoter),Item(namemilitaryservice),labelAdditionalInfoforadults,showborderTrue,visiblewhenage18,)viewView(Group(gengroup,10,Label(Usingvisiblewhen:),10,childgroup,adultgroup),titlePersonalInformation,resizableTrue,buttons〔OK〕)demoPerson(firstnameSamuel,lastnameJohnson,age16)ifnamemain:demo。configuretraits() 5。2图: 6login: 6。1超级简单的登录框,代码:fromtraits。apiimportHasTraits,Str,IntclassModelManager(HasTraits):modelnameStr字符串categoryStr字符串modelfileStr字符串modelnumberInt数值ifnamemain:modelModelManager()model。configuretraits() 6。2图: 7treeeditor: 7。1代码:fromtraits。apiimportHasTraits,Str,Regex,List,Instancefromtraitsui。apiimportItem,View,TreeEditor,TreeNodeclassEmployee(HasTraits):nameStr(unknown)nameStr()titleStr()phoneRegex(regexrddddddd)defdefaulttitle(self):self。titleSeniorEngineerclassDepartment(HasTraits):nameStr(unknown)employeesList(Employee)classCompany(HasTraits):nameStr(unknown)departmentsList(Department)employeesList(Employee)noviewView()treeeditorTreeEditor(nodes〔TreeNode(nodefor〔Company〕,autoopenTrue,children,labelname,viewView(〔name〕)),TreeNode(nodefor〔Company〕,autoopenTrue,childrendepartments,labelDepartments,constantlabelviewnoview,add〔Department〕,),TreeNode(nodefor〔Company〕,autoopenTrue,childrenemployees,labelEmployees,constantlabelviewnoview,add〔Employee〕),TreeNode(nodefor〔Department〕,autoopenTrue,childrenemployees,labelname,labelwithDepartmentnameviewView(〔name〕),add〔Employee〕),TreeNode(nodefor〔Employee〕,autoopenTrue,labelname,labelwithEmployeenameviewView(〔name,title,phone〕))〕)classPartner(HasTraits):nameStr(unknown)companyInstance(Company)traitsviewView(Item(namecompany,editortreeeditor,showlabelFalse),titleCompanyStructure,buttons〔OK〕,resizableTrue,stylecustom,width。3,height500)jasonEmployee(nameJason,titleSeniorEngineer,phone5361057)mikeEmployee(nameMike,titleSeniorEngineer,phone5361057)daveEmployee(nameDave,titleSeniorDeveloper,phone5361057)martinEmployee(nameMartin,titleSeniorEngineer,phone5361057)duncanEmployee(nameDuncan,titleConsultant,phone5261057)demoPartner(nameEnthought,Inc。,companyCompany(nameEnthought,employees〔dave,martin,duncan,jason,mike〕,departments〔Department(nameBusiness,employees〔jason,mike〕),Department(nameScientific,employees〔dave,martin,duncan〕)〕))ifnamemain:demo。configuretraits() 7。2图: 8codeeditor: 8。1代码:fromtraits。apiimportHasTraits,Codefromtraitsui。apiimportItem,Group,ViewclassCodeEditorDemo(HasTraits):codesampleCode(importsyssys。print(helloworld!))codegroupGroup(Item(codesample,stylesimple,labelSimple),Item(),Item(codesample,stylecustom,labelCustom),Item(),Item(codesample,styletext,labelText),Item(),Item(codesample,stylereadonly,labelReadOnly))traitsviewView(codegroup,窗口标题名。大小,按钮oktitleCodeEditor,width600,height600,buttons〔OK〕)demoCodeEditorDemo()ifnamemain:demo。configuretraits() 8。2图: 超级简单,简化GUI的布局 自己整理并分享出来。 喜欢的人,请点赞、关注、评论、转发和收藏。