本文介绍使用ttk::notebook组件设计多页面管理的GUI界面。ttk::notebook组件可将页面分为多页来管理,每一页有一个标签,可使用标签在多个页面之间进行切换,适合复杂的功能界面GUI设计。
例如下图为hypermesh自动探测实体孔的界面,该界面将功能界面分成了五页,点击其中一个页面标签,页面就会隐藏此前显示的页面窗口而切换到关联的页面,使用该界面便可实现较为复杂的hypermesh 探测二维和三维孔的功能。
图1 hypermesh探测实孔窗口界面
上图中包含的组件大致有为ttk::notebook 、ttk::combobox 、label、entry、radiobutton 、button等组件。模仿上面的页面,我将尝试做一个简化版的界面,如下图所示。
图2 本文设计界面
如何实现图2的多页面版图呢?源码走起!你细品>>>
#create a notebook in the case
set nb [ttk::notebook .n -width 500 -height 500 -padding 30]
grid $nb
set f1 [ttk::frame $nb.f1 -relief raised -borderwidth 4 \
-height 100 -width 50]
set f2 [ttk::frame $nb.f2 -relief raised -borderwidth 4 \
-height 100 -width 50]
set f3 [ttk::frame $nb.f3 -relief raised -borderwidth 4 \
-height 100 -width 50]
$nb add $f1 -text "Preparation"
$nb add $f2 -text "2D Holes"
$nb add $f3 -text "3D Holes"
#create Preparation
set lbp_1 [label $f1.lb1 -fg blue -text "Select entities:" ]
set lbp_2 [label $f1.lb2 -fg blue -text "Detect holes in:" ]
grid $lbp_1 -sticky w -pady 1m
grid $lbp_2 -sticky w -pady 1m
set mylist [list components elements]
set comb [ttk::combobox $f1.cb -textvariable combName -value $mylist\
-postcommand {puts "output the user selected item: $combName"}]
#$comb config -postcommand {puts "output the user selected item: $combName"}
grid $comb -sticky e -column 2 -row 0 -padx 150 -pady 1m
set combName components
#create 2DHoles
set lst [list general Circular Rounded Square Rectangular]
set lbd_1 [label $f2.lbd1 -fg blue -text "Hole Shape"]
set comb_2d [ttk::combobox $f2.comb_2d -textvariable combovalue -values $lst \
-justify right];#justify show position of arrow
grid $lbd_1 -sticky w -column 0 -row 0
grid $comb_2d -sticky w -column 1 -row 0 -padx 180 -pady 1m
$comb_2d set [lindex $lst 0]
#set combovalue "general"
#$comb_2d config -postcommand {puts "output the user selected item: $combovalue"}
# it must be "<< >>" in the bind,not "< >"
bind $comb_2d <<ComboboxSelected>> {
switch [%W get] {
"general" {puts "output the user selected item is: $combovalue"}
"Circular" {puts "output the user selected item: $combovalue"}
"Rounded" {puts "output the user selected item: $combovalue"}
"Square" {puts "output the user selected item: $combovalue"}
"Rectangular" {puts "output the user selected item: $combovalue"}
}
}
#3D holes
set rdn_1 [radiobutton $f3.rdb1 -text "Minimum dimesion" -variable tag -value 5 -anchor w]
set rdn_2 [radiobutton $f3.rdb2 -text "Maxinum dimesion" -variable tag -value 10 -anchor w]
grid $rdn_1 -sticky w -column 0 -row 0
grid $rdn_2 -sticky w -column 0 -row 1
下面再对呈现的代码胡说八道一番,不喜跳过>>>
实际上,notebook 将每一个页面的内容都分布在ttk::frame或frame组件里,然后使用add 命令向notebook 添加可用的组件,例如每个f rame 中可布置button 、entry 、label 、ttk::combobox 等功能组件以实现二次开发的功能。
主题组件ttk::combobox包括一个下拉框和一个输入框组件。该组件能从一系列固定值中选择值,类似于调节框,一次只能选择一个值。当选中-value中一个值时,便将该值赋给-textvariable下的变量。ttk::notebook在其值发生变化时,将《ComboboxSelected》虚拟事件发送给自身,此时你可以使用组合框的get方法找出所选内容,然后对其进行操作以实现预定功能。此种方法,通常可结合bind命令辅以switch选择函数来实现 , 然后利用“%W get”获得当前事件组件的-value值。(% W 获得当前事件组件的完整路径名称)
bind $comb_2d <<ComboboxSelected>> {script}
当然,你也可以不使用bind来绑定ttk::notebook,借助ttk::notebook自带的-postcommand 命令选项也可实现变量的传递,如下:
set comb [ttk::combobox $f1.cb -textvariable combName -value $mylist\
-postcommand {puts "output the user selected item: $combName"}]
接下来如何给ttk::notebook 赋初值呢?这里有两种方法:
set textvarible value
. comb_2d set [lindex $lst 0]
效果如下图所示:
图3 2D Holes页面初始值预览