最近一直在研究Tcl/Tk,而且有点乐不思蜀了,这里的“蜀”说的是Perl,因为一直用Perl的缘故,现在倒是有点冷落它了。介绍一下最近实现的一个dateentry,其实借鉴了很多iwidgets::dateentry的思路,但是由于该package年代久远,现在看来却是有点惨不忍睹,所以不得不重新写一个。
以上就是最终的控件样式,因为比较喜欢苹果的风格,所以总体上以白色为主,比较清新。代码的实现上,主要是解决一下几个问题。
首先,如何布局,因为使用canvas的缘故,所有的内部组件必须使用x、y坐标的形式放置,如此一来就不得不小心地控制所有组件的位置。
第二,其中的日期按钮都是复用的,也就是说某个月中产生的日期按钮在下一个月份更新时并不会被注销,而是改变了text。这么一来解决了组件路径冲突的问题,而8.6中将可能可以使用%来自动生成随机数。
第三,日历的显示,使用了overrideredirect来隐藏了toplevel的边框。使用geometry,并根据dateentry的label位置,来定位日历,使其能够紧贴控件显示。
第四,点击除日历外的任意位置,都会注销日历。这么作完全是为了符合windows使用的习惯,当然这样也很方便。需要使用“grub -global $toplevel”将事件的捕获限定在当前显示的日历中,然后通过判定鼠标位置是否在日历内,来决定是否该注销日历。
这是一个示例,并没有打包,使用的时候,直接运行即可,但需要安装tcltk解析器。如需应用到具体程序中可电邮我,独家发布,欢迎使用。
download