首页/文章/ 详情

tcl/tk学习笔记(2)|一个简单计算器的GUI教给你的不只是计算

1年前浏览974

在Hypermesh二次开发中GUI是非常重要的一环,它将底层操作代码转化为图形界面,界面简单直观,输入少量参数就可批量实现二次开发的功能。下面我将试图制作一个简单的四则运算计算器,虽麻雀虽小,但五脏俱全,此计算器包含了radiobutton、button、entry、label、labelframe等组件的综合应用。

1
问题描述

基于tcl/tk语言,制作一个四则运算计算器,如下图所示。

 

2
设计思路

1.在计算类型中,通过单选按钮选择求解类型;

2.在计算模块中,输入运算变量,点击计算按钮完成计算;

3.点击退出按钮,关闭系统界面。

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变量名一致来完成关联。输入计算变量后,通过点击计算按钮完成计算。

button按钮设置:-bg选项将按钮设置成了灰色。

set btn1 [button .mywin.btn1 -text "Calculate" -width 10 -bg gray ]

4
button按钮的一个bug处理方法

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]}

5
脚本代码

下面献上源码,以供大家食用。

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}

运行上述代码,便可获得如下界面:

好了,一个实现四则运算的计算器制作完了。

来源:仿真社
二次开发
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-02-02
最近编辑:1年前
仿真社
硕士 ABAQUS/LS-DYNA探索者
获赞 202粉丝 510文章 90课程 5
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈