这里讲的两个都是非标准组件,所以一般都是建立在标准的pTk组件之上的,由纯perl代码写成的,因此也便于修改。
第一个是ToolBar,就是文件浏览器中的在菜单栏之下的,一般叫工具栏。pTk中的ToolBar标准支持Button,Label,LabEntry,OptionMenu和自带的一个separator(这个还是很有用的)。如果要加入其他的组件,比如BrowseEntry,pack之后会被ToolBar放到工具栏的第二行上,很不方便。现在我们来看看ToolBar.pm,里面到底是怎么处理标准支持的。搜索到ToolLabel的sub,里面的代码如下:
1 sub ToolLabel {
2 my $self = shift;
3 my $l = $self->{CONTAINER}->Label(@_);
4 push @{$self->{WIDGETS}} => $l;
5 $self->_packWidget($l);
6 return $l;
7 }
对比其他的几个sub,我可以很肯定,只要将第四行中的Label改成BrowseEntry就可以了,这里缺少的一行是关于tip的,对于BrowseEntry来说,没有必要。
第二个是DateEntry。就是一个日期选择器,很多时候我们会用到它。我再使用的时候发现了一个问题,就是在显示月份的地方,出现了乱码,打开DateEntry.pm一看,找到如下一段:
1 my $monthlabel = (defined &strftime
2 ? strftime($w->cget('-headingfmt'),0,0,0,1,
3 $w->{_month}-1,$w->{_year}-1900)
4 : $w->{_month} . "/" . $w->{_year}
5 );
显然,它是用了
strftime这个函数,去除选择,直接用冒号后的形式即可。
还有,如何让在日期控件中的日期按钮被按下的时候响应一个事件。作为一般的控件这是一个必要的功能,但是在DateEntry中却没有,查看了源代码,原来是回调了用于更新标签和关闭的selectDay函数。这么作是很不负责任的,如果不修改源代码,我们就不得不在此控件旁添加一个按钮用于触发事件,这样一来不美观,而来更重要的是不符合一般的使用习惯。为此需要在ConfigSpec中添加一个-btncommand的标签,并在selectDay中回调。