tcl 中的 GUI 程序。如何在ns2中编译它?

Posted

技术标签:

【中文标题】tcl 中的 GUI 程序。如何在ns2中编译它?【英文标题】:GUI programs in tcl. how to compile it in ns2? 【发布时间】:2021-10-18 05:04:59 【问题描述】:

当我试图编译从互联网上获取的程序时

 proc demo  
    canvas .c -bg white
    frame .f
    button .f.c  -text Clear       -command .c delete all
    button .f.co -text Complete    -command showComplete .c
    button .f.tr -text Triangulate -command showTriangulate .c
    eval pack [winfo children .f] -side left
    pack .c .f -fill x -expand 1
    bind .c <1> addVertex %W %x %y
    .c bind vertex <3> %W delete current
 
 proc showComplete w 
    $w delete edge
    foreach edge [completeGraph [get vertex $w]] 
        showEdge $w $edge
    
 
 proc showEdge w edge fill gray 
    regexp (.+)/(.+),(.+)/(.+) $edge -> x0 y0 x1 y1
    set ::length($edge) [expr hypot($x1-$x0,$y1-$y0)]
    $w create line $x0 $y0 $x1 $y1 -tags "edge $edge" -fill $fill
 
 proc get tag w 
    set res 
    foreach v [$w find withtag $tag] 
        lappend res [lindex [$w gettags $v] 1]
    
    set res
 
 proc completeGraph vertices 
    set graph 
    foreach i $vertices 
        foreach j $vertices 
            if $i<$j lappend graph $i,$j
        
    
    set graph
 
 proc showTriangulate w 
    $w delete edge
    showComplete $w
    wm title . Wait...
    set t0 [clock clicks -milliseconds]
    foreach edge [triangulate [get edge $w]] 
        showEdge $w $edge red
    
    wm title . [expr [clock clicks -milliseconds] - $t0]
 

 proc triangulate graph 
    while 1 
        set found 0
        foreach i $graph 
            foreach j $graph 
                if $i!=$j && [crossing $i $j] 
                    lremove graph [longer $i $j]
                    set found 1
                    break
                
            
            if $found break
        
        if !$found break
    
    set graph
 

 proc crossing edge1 edge2 
    regexp (.+)/(.+),(.+)/(.+) $edge1 -> x0 y0 x1 y1
    regexp (.+)/(.+),(.+)/(.+) $edge2 -> x2 y2 x3 y3
    if [adjacent $x0/$y0 $x1/$y1 $x2/$y2 $x3/$y3] return 0
    set m1 [slope $x0 $y0 $x1 $y1]
    set b1 [expr $y0-$m1*$x0]
    set m2 [slope $x2 $y2 $x3 $y3]    
    set b2 [expr $y2-$m2*$x2]
    set x [slope $m2 $b1 $m1 $b2]
    expr [between $x0 $x $x1] && [between $x2 $x $x3]
 
 proc adjacent args 
    expr [llength [lsort -unique $args]]<[llength $args]
 
 proc slope x0 y0 x1 y1 
    # slightly "bend" a vertical line, to avoid division by zero
    if $x1==$x0 set x1 [expr $x1+0.00000001]
    expr double($y1-$y0)/($x1-$x0)
 
 proc between a b c 
    expr $b==[lindex [lsort -real [list $a $b $c]] 1]
 
 proc longer edge1 edge2 
    global length
    expr $length($edge1) > $length($edge2)? $edge1: $edge2
 
 proc addVertex w x y 
    $w create rect [expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2] \
        -tags "vertex $x/$y" -fill blue
 
 proc lremove varName element 
    upvar 1 $varName var
    set pos [lsearch $var $element]
    set var [lreplace $var $pos $pos]
 
 
 demo
 bind . <Escape> exec wish $argv0 &; exit
 bind . <F1> console show

无效的命令名称“画布” 在执行时 “画布 .c -bg 白色” (程序“演示”第 2 行) 从内部调用 “演示”

在此画布命令未读取。我有 nam(网络动画师),我可以编译其他程序。我想知道如何运行它。请任何人帮忙。

在 ns2 中编​​译时,我觉得

【问题讨论】:

otcl 解释器$ ns 可以运行 OTCL simulations.tcl。 必须在wish 或其他已加载 Tk 的 tcl 环境中运行。脚本顶部的package require Tk可能起作用,具体取决于此 ns2 的配置方式。 谢谢@Shawn。但是如何重新配置​​ ns2 以使 tk 工作 @KnudLarsen 谢谢先生。但是我不明白。 wish → → ns-allinone-2.35/bin/wish8.5 ......... 使用示例:./wish8.5 canvas.tcl .......... 'ns' 是 otcl 解释器。 'ns' 并不意味着理解所有 tcl 命令。 【参考方案1】:

wish → → ns-allinone-2.35/bin/wish8.5 ......... 使用示例:./wish8.5 canvas.tcl .......... 'ns'是 otcl 解释器。 'ns' 并不意味着理解所有 tcl 命令。

【讨论】:

以上是关于tcl 中的 GUI 程序。如何在ns2中编译它?的主要内容,如果未能解决你的问题,请参考以下文章

ns2.23——ns-simple.tcl样例解析

ns2.23——ns-simple.tcl样例解析

ns2.34移植leach协议

ubuntu14+ns2

TCL/TK是啥?

一个简单的ns2实验全过程