在Hypermesh二次开发中GUI是非常重要的一环,它将底层操作代码转化为图形界面,界面简单直观,输入少量参数就可批量实现二次开发的功能。下面我将试图制作一个简单的四则运算计算器,虽麻雀虽小,但五脏俱全,此计算器包含了radiobutton、button、entry、label、labelframe等组件的综合应用。
基于tcl/tk语言,制作一个四则运算计算器,如下图所示。
1.在计算类型中,通过单选按钮选择求解类型;
2.在计算模块中,输入运算变量,点击计算按钮完成计算;
3.点击退出按钮,关闭系统界面。
在第一个labelframe里设置四个单选按钮(Add、Subtract、Multiply、Divide)完成求解类型的选择。
labelframe设置方法:-fg选项可设置字体的显示颜色。
set f1 [labelframe.w.lf1 -text "Calculation Type" -fg blue -padx 72]
radiobutton按钮设置:点击radiobutton将-value的值赋给-variable下的变量,例如点击rdb1按钮,则tag=“+”,后续便可通过$tag调用符号“+”。
set rdb1 [radiobutton .mywin.rdb1 -text Add -variable tag -value "+"]
在第二个labelframe里完成计算变量的输入和求解。设置两个动态文本框entry以便输入计算变量。运算符号(+-*/),等号用静态文本框label来显示。运算符号的显示可通过label组件下的-textvariable变量与radiobutton下的-variable变量名一致来完成关联。输入计算变量后,通过点击计算按钮完成计算。
set btn1 [button .mywin.btn1 -text "Calculate" -width 10 -bg gray ]
Tcl/tk创建按钮后,我遇到了一个小问题,鼠标并未主动点击按钮,系统却执行了按钮的-command命令。例如:
button .calculate -text "Calculate"-command {exit}
移动鼠标在按钮以外的区域,界面也自动退出。
我的解决方法:button中不要涉及-command命令,而是通过bind的ButtonPress选项来执行button中的-command命令:
button .calculate -text "Exit"
bind .calculate
若button的-command执行的是一个表达式,例如通过-command中的脚本将表达式结果写入label中-textvariable sum中,为了实现此功能,则bind中的脚本不要再添加 “$btn1 config -command {表达式}”,否则也会发生未点击按钮,系统就执行了命令的现象。
set btn1 [button$f.btn1 -text "Calculate" -width 10 -bg gray]
bind$btn1 $btn1 config \
-command {set sum [expr$var1 + $var2]}}
正确写法:
set btn1 [button$f.btn1 -text "Calculate" -width 10 -bg gray]
bind$btn1 set sum [expr$var1 + $var2]}
下面献上源码,以供大家食用。
set w [toplevel .w]
wm title $w "Calculation"
wm geometry $w 700x300
set f1 [labelframe $w.lf1 -text "Calculation Type" -fg blue -bd 2 -padx 72];#-padx 142
set f2 [labelframe $w.lf2 -text "Calculation" -fg blue -bd 2 -padx 60 ]
grid $f1 -row 0 -column 0 -sticky nsew
grid $f2 -row 1 -column 0 -sticky nsew
set rdb1 [radiobutton $f1.rdb1 -text Add -variable tag -value "+" -anchor w];#-value "+"
set rdb2 [radiobutton $f1.rdb2 -text Subtract -variable tag -value "-" -anchor w]
set rdb3 [radiobutton $f1.rdb3 -text Multiply -variable tag -value "*" -anchor w]
set rdb4 [radiobutton $f1.rdb4 -text Divide -variable tag -value "/" -anchor w]
grid $rdb1 -row 0 -column 0 -sticky w
grid $rdb2 -row 0 -column 1 -sticky w
grid $rdb3 -row 0 -column 2 -sticky w
grid $rdb4 -row 0 -column 3 -sticky w
set var1 12
set var2 34
set ent1 [entry $f2.ent1 -width 10 -textvariable var1]
set ent2 [entry $f2.ent2 -width 10 -textvariable var2]
set lb1 [label $f2.lb1 -width 2 -text "+" -textvariable Label -font 10]
set lb2 [label $f2.lb2 -width 2 -text "=" ]
set lb3 [label $f2.lb3 -width 20 -textvariable sum]
set btn1 [button $f2.btn1 -text "Calculate" -width 10 -bg gray ]
set btn2 [button $f2.btn2 -text "Exit" -width 10 -bg gray ]
grid $lb1 -row 0 -column 1 -padx 40 -sticky w
grid $ent1 -row 0 -column 0 -sticky nsew
grid $ent2 -row 0 -column 2 -sticky w
grid $lb2 -row 0 -column 3 -padx 1 -sticky w
grid $btn1 -row 1 -column 1 -padx 1 -pady 5 -sticky nsew
grid $lb3 -row 0 -column 4 -padx 1 -sticky w
grid $btn2 -row 1 -column 2 -padx 1 -pady 5 -sticky w
#bind btn1 to excute button 1 command
bind $btn1 <ButtonPress> {set sum [expr $var1 $tag $var2]}
bind $btn2 <ButtonPress> {$btn2 config -command {exit}};
bind $rdb1 <ButtonPress> {set Label $tag}
bind $rdb2 <ButtonPress> {set Label $tag}
bind $rdb3 <ButtonPress> {set Label $tag}
bind $rdb4 <ButtonPress> {set Label $tag}
运行上述代码,便可获得如下界面:
好了,一个实现四则运算的计算器制作完了。