Abaqus图形界面程序(GUI)开发过程中会用到各种各样的控件(Widget),例如对话框、文本框、按钮、单选框、复选框、下拉框、表格等等。控件是GUI应用程序的最基本组成元素,用户可以使用各类控件从图形界面程序中收集参数、显示结果以及发送指令等。
1. GUI图形界面的创建方式
主要有以下两种:
- (1)使用RSG对话框构造器创建
- (2)使用Abaqus GUI工具包创建
使用RSG对话框构造器创建:
使用这种方法创建界面较为简单,但是包含的控件较少,仅有上图所示的控件栏(上图写错了,不是空间栏)列出来的这些。
针对更加复杂的GUI界面,需要采用第二种方法,即采用编辑源代码的方式来搞GUI。使用该方法创建的控件种类丰富,但是不能像RSG对话框那样直观。
2. 目标和消息
Abaqus GUI工具包是通过目标/消息(target/message)机制实现GUI对象间的交互,即控件之间相互传递消息,以及接受其他控件发来的消息。
消息由两部分构成,分别为消息类型和消息ID。消息类型指某个动作,例如“点击某个按钮”、“松开某个按钮”等,消息ID指的是消息的发送者。
Abaqus GUI工具包中的大部分控件都有指定目标和消息ID的变量,即使某种控件没有指定目标和ID的变量,也可以通过setTarget 和 setSelector方法来设定其目标以及ID。例如:
FXButton(parent, 'Label',tgt-self, sel=selfID_D) #创建一个按钮
groupBox =FXGroupBox(parent) #创建一个控件盒,自身无法设置目标和ID
groupBox.setTarget(self) #设置其目标
groupBox.setSelector(self.ID_2) #设置其消息ID .
控件可以发送多种类型的消息,最常用的两种消息类型是SEL_COMMAND和SEL_UPDATE。
- SEL_COMMAND类型的消息一般表示某个控件被触发,例如,用户按下了按钮。
- SEL_UPDATE类型的消息一般是在某一控件需要请求其目标来更新自身状态时才会发送。在自动更新的过程中,每个控件会给它的目标发送一个SEL_UPDATE消息,请求自身被更新,通过这种方式来实现应用程序保持最新的状态。
消息通过映射传递给消息处理方,用户可以指定其接收到某消息类型以及消息ID时触发某个函数(例如上图的onCmdA、onCmdB等)。
消息映射一般通过FXMAPFUNCO函数来定义,FXMAPFUNC()函数有4个变量,分别是self、消息类型( message type )、消息ID ( message ID)以及调用的方法名( method name )。其中方法名必须由类名来限定,例如 className.methodName,className为类名,methodName为方法名。
当接收到的消息类型和消息ID与某一个FXMAPFUNC()函数中定义的消息类型和消息ID 匹配时,相应的方法就会被调用。另外,如果需要在消息映射中定义一段范围内的ID,可以采用FXMAPFUNCS()函数,该函数的变量有5个: self、消息类型( message type)、起始消息 ID ( start message ID)、结束消息ID ( end message ID)以及方法名( method name )。另外,用户可以使用SELTYPE和 SELID 函数从消息处理方获取消息的类型和ID。
下面的示例代码体现了消息映射、消息ID、消息处理的关系:
class MyClass(BaseClass):
[ID_1,ID_2] = range(BaseClass.ID_LAST,BaseClass.ID_LAST+2)
#分配ID
# range() 函数返回的是一个可迭代对象(类型是对象)
def __init__(self):
BaseClass.__init__(self)
FXMAPFUNC(self,SEL_COMMAND,self.ID_1,MyClass.onCmdPrintMsg)
FXMAPFUNC(self,SEL_COMMAND,self.ID_2,MyClass.onCmdPrintMsg)
#消息映射,指定消息ID及执行方法
FXButton(self,'Button1',None,self.ID_1)
FXButton(self,'Button2',None,self.ID_2)
#创建按钮控件,指定其目标及ID
#定义执行方法
def onCmdPrintMsg(self,sender,sel,ptr):
#使用SELID函数获取消息ID
if SELID(sel) == self.ID_1:
print "Button1 was pressed"
elif SELID(sel) == self.ID_2:
print "Button2 was pressed"
return 1
在上述实例中,定义了两个按钮“Button 1”和“Button 2”,其目标均是类本体self,消息ID分别是self.ID_1和 self.ID_2。同时程序中定义了两个消息映射,分别对应 self.ID_1和 self.ID_2,两个消息映射所对应的执行方法均是onCmdPrintMsg()。当按钮“Button 1”被触发时,其消息ID被传递给其目标 self(MyClass),经消息映射判断,消息ID与第一组消息映射匹配,因此该组映射中指向的执行方法 MyClass.onCmdPrintMsg()被触发。
上面的示例代码应该是书中作者摘取的一段源码,可能看着不太懂,没有关系,大致了解工作机制即可。后面会对控件的使用做详细的介绍。