在写
bugd
的用户控制板块的时候,涉及到了比较多的弹出选项,虽然有差别,但是总体上还是比较类似的。比如说,在左侧的一列是用于说明的
label
,中间是接收输入的
entry
,右侧是可选的通过显示或隐藏错误图标来表示可用性的
label
。从行角度讲,除了信息输入项外,可能有用到
checkbuton
。
在还没有意识到重复性之前,我是一个接着一个地写这些代码的,最后弄得程序巨大而拖沓。因此想做一个抽象,来分离显示界面的逻辑与数据的分离,从而达到仅通过修改数据即可得到预期界面的效果。
首先,需要一个方便可用的
geometry manager
,可以考虑
pack
和
grid
。使用
pack
,除非设置好组件的宽度,不然很难对齐,但不同的组件对于宽度的单位也各不相同,会给抽象增加复杂性,所以在这种明显需要对齐的情况中,我个人比较倾向与使用
grid
。
接着,组件的数据表示要简洁而必要且一目了然,在这点上我花了点功夫,最后还是套用了在
bugd
中用于
C/S
间传递数据的格式。
proc frameData {} {
# widget:state:width:pathname:text
return {
{label:::unl:username entry:readonly:40:une: label::3:veriunl:}
{label:::pwdl:password entry::40:pwde:}
{{checkbutton:::chkadmin:if admin?} {}}
}
}
用
4
个“
:
”来作为分隔符(当然也可以用其他的)的一串信息,对应上面的注解。为了达到扩展的目的,使用空串来说明该位子由前一个可用组件来占据。