当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » 其他  » 图形界面开发/GUI/CGI
分享到: 
收藏 +0
4
Tcl这门语言在OSC上被严重忽略了,在“代码分享区”至今没有人分享Tcl/Tk的代码,所以我来做第一个吃螃蟹的人。

Tcl是一门非常灵活的语言,我认为它是C语系的Lisp!它也能自定义控制语句、新增语法等。它不仅提供各平台的解释器,使用Tclkit还能打包(注意,不是编译)成各个平台原生的独立可执行文件!

本例用Tcl/Tk实现一个计算器,它的功能包括:
1. 跨平台:给出了Mac、Linux、Windows三个平台的运行截图
2. 支持四则运算优先级:1+2*3=7
3. 图形界面
4. 整数计算支持无限精度:999999999*999999999=999999998000000001
用其他语言来实现上述功能就很麻烦,不服用代码来辩~哈
标签: Tcl/Tk

代码片段(4) [全屏查看所有代码]

1. [图片] mac.png    

2. [图片] windows.bmp    

3. [图片] linux.png    

4. [代码]Tcl/Tk版计算器     跳至 [4] [全屏预览]

set result 0
set express {0 +}

entry .result -justify right -textvariable result
grid .result -padx 2m -pady 2m -row 0 -column 0 -columnspan 4
for {set row 0} {$row < 4} {incr row} {
    for {set column 0} {$column < 4} {incr column} {
        set value [lindex {
            {7 8 9 /} {4 5 6 *} {1 2 3 -} {. 0 = +}
        } $row $column]
        set name ".btn[regsub {\.} $value dot]"
        button $name -text $value -command [list handle $value]
        grid $name -ipadx 1m -pady 1m -row [expr $row + 1] -column $column
    }
}

proc handle {value} {
    global result express
    switch -regexp $value {
        [0-9] {
            if {$result == 0} {
                set result $value
            } else {
                append result $value
            }
        }
        [-+*/] {
            lappend express $result $value
            set result 0
        }
        [.] {
            if {[string first . $result] < 0} {
                append result .
            }
        }
        = {
            lappend express $result
            set result [expr $express]
            set express {0 +}
        }
    }
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(36)

  • 1楼:靐鑫森淼焱垚 发表于 2013-05-25 11:09 回复此评论

    set buttons {

        {7 8 9 /}

        {4 5 6 *}

        {1 2 3 -}

        {. 0 = +}

    }

    还带这样的,真BT
  • 2楼:南湖船老大 发表于 2013-05-25 11:10 回复此评论
    TCL 只适合运维拿来玩玩,做一些简单的脚本。
    它的UI库,那bug简直多到惨不忍睹,都没人好意思维护了
  • 3楼:小熊猫大暴走 发表于 2013-05-25 11:21 回复此评论
    可以在窗体上加个菜单吗?我记得windows api 两句就可以把菜单显示出来
  • 4楼:Happur 发表于 2013-05-25 14:47 回复此评论
    我也喜欢这个语言,简单的脚本,简单的图形界面,语法也比较帅气,玩玩还是不错的。但是语言本身的数据结构不是太好,用法也不统一,费点劲。第三方可用的东西也不是太多。会的人相对少,开发很少听说有用它的,通常有一些辅助性的作用,比如嵌入脚本,也许expect用的还多些。个人觉得,个方面没有太大的优势,学习的价值不大了,玩玩还好!
  • 5楼:blindcat 发表于 2013-05-25 14:56 回复此评论
    很牛X呢,一直以为TCL是做电器的呢
  • 6楼:redraiment 发表于 2013-05-25 16:44 回复此评论

    引用来自“天雷”的评论


    set buttons {

        {7 8 9 /}

        {4 5 6 *}

        {1 2 3 -}

        {. 0 = +}

    }

    还带这样的,真BT
    这里只是定义了一个buttons变量,二维列表。 真正生成界面的是下面的for循环
  • 7楼:redraiment 发表于 2013-05-25 17:00 回复此评论

    引用来自“阿尔法兽”的评论

    TCL 只适合运维拿来玩玩,做一些简单的脚本。
    它的UI库,那bug简直多到惨不忍睹,都没人好意思维护了
    我知道的,在我们公司有一个项目就完全是用Tcl开发的。
  • 8楼:redraiment 发表于 2013-05-25 17:03 回复此评论

    引用来自“怪兽狂殴奥特曼”的评论

    可以在窗体上加个菜单吗?我记得windows api 两句就可以把菜单显示出来
    可以的,也只要一两句话。晚上回去改进一下〜
  • 9楼:redraiment 发表于 2013-05-25 17:12 回复此评论

    引用来自“Happur”的评论

    我也喜欢这个语言,简单的脚本,简单的图形界面,语法也比较帅气,玩玩还是不错的。但是语言本身的数据结构不是太好,用法也不统一,费点劲。第三方可用的东西也不是太多。会的人相对少,开发很少听说有用它的,通常有一些辅助性的作用,比如嵌入脚本,也许expect用的还多些。个人觉得,个方面没有太大的优势,学习的价值不大了,玩玩还好!
    我反而觉得他是最统一的!只有字符串一种数据结构,比lisp分atom和list更统一。第三方库我感觉也很多,安装了它的标准库tcllib后,加密、邮件、cgi...基本都有了〜
  • 10楼:redraiment 发表于 2013-05-25 17:12 回复此评论

    引用来自“blindcat”的评论

    很牛X呢,一直以为TCL是做电器的呢
    哈,所以它的cl是小写的
  • 11楼:赵云30 发表于 2013-05-26 08:58 回复此评论
    不错。我以前的公司用expect来运行单元测试程序,没研究过。
  • 12楼:拜仁慕尼黑 发表于 2013-05-28 12:42 回复此评论
    加油吧~
  • 13楼:帖子列表 发表于 2013-05-28 16:22 回复此评论

    引用来自“阿尔法兽”的评论

    TCL 只适合运维拿来玩玩,做一些简单的脚本。
    它的UI库,那bug简直多到惨不忍睹,都没人好意思维护了
    神人什么都懂的
  • 14楼:InBi 发表于 2013-05-28 16:53 回复此评论
    TCL只有字符串一种数据类型,真的很不习惯。
    TCL有句口号是一切都是字符串。
    一个数学表达式居然可以加双引号:
    "[expr$row + 1]" ==  [expr$row + 1]
  • 15楼:redraiment 发表于 2013-05-28 16:59 回复此评论

    引用来自“InBi”的评论

    TCL只有字符串一种数据类型,真的很不习惯。
    TCL有句口号是一切都是字符串。
    一个数学表达式居然可以加双引号:
    "[expr$row + 1]" ==  [expr$row + 1]
    正因为一切都是字符串,包括代码本身也是。因此它也像Lisp一样代码即数据,可以自定义控制符等;而且,因为数据类型只有一种,完全不需要类型转换,不需要parseInt、toString这样的函数。
  • 16楼:南湖船老大 发表于 2013-05-28 17:09 回复此评论

    引用来自“李马燕”的评论

    引用来自“阿尔法兽”的评论

    TCL 只适合运维拿来玩玩,做一些简单的脚本。
    它的UI库,那bug简直多到惨不忍睹,都没人好意思维护了
    神人什么都懂的
    不懂,年轻的时候接触过些皮毛,什么TCL,D语言,都玩过下,最终都放弃了,现在不碰非主流语言了
  • 17楼:找不到名字 发表于 2013-05-28 20:18 回复此评论
    python的原生图形库也是Tcl/tk。这个计算器其实也可以用Lua, python来写。
  • 18楼:redraiment 发表于 2013-05-28 20:25 回复此评论

    引用来自“这不科学”的评论

    python的原生图形库也是Tcl/tk。这个计算器其实也可以用Lua, python来写。
    窃以为它们不如Tcl/tk简练
  • 19楼:Ryan-瑞恩 发表于 2013-05-28 21:14 回复此评论
    看样子挺不错啊。。。。
  • 20楼:习总 发表于 2013-05-28 21:25 回复此评论

    引用来自“阿尔法兽”的评论

    引用来自“李马燕”的评论

    引用来自“阿尔法兽”的评论

    TCL 只适合运维拿来玩玩,做一些简单的脚本。
    它的UI库,那bug简直多到惨不忍睹,都没人好意思维护了
    神人什么都懂的
    不懂,年轻的时候接触过些皮毛,什么TCL,D语言,都玩过下,最终都放弃了,现在不碰非主流语言了
    现在不年轻啦?
开源从代码分享开始 分享代码
redraiment的其它代码 全部(63)...