Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Tcl到Itcl的转换_Tcl_Itcl - Fatal编程技术网

从Tcl到Itcl的转换

从Tcl到Itcl的转换,tcl,itcl,Tcl,Itcl,我对ITCL很陌生,有人能帮我把下面的代码从Tcl转换成ITCL吗 catch { namespace delete ::HVToolSet } namespace eval ::HVToolSet { } { } proc ::HVToolSet::Main {} { if {[winfo exists .main]} { destroy .main } set ::HVToolSet::base [toplevel .main] varia

我对ITCL很陌生,有人能帮我把下面的代码从Tcl转换成ITCL吗

catch { namespace delete ::HVToolSet }
namespace eval ::HVToolSet { } {
}
proc ::HVToolSet::Main {} {
    if {[winfo exists .main]} {
        destroy .main
    }
    set ::HVToolSet::base [toplevel .main]  
    variable tab_frame
    set x 200
    set y 200
    wm geometry $::HVToolSet::base ${x}x${y}+100+0  
    wm title $::HVToolSet::base "Chevron's Build Effective Stress Results Tool" 
    wm focusmodel $::HVToolSet::base passive    
    set creatFrame [frame .main.mnFrame]
    pack $creatFrame -side top -anchor nw -expand 1 -fill both -padx 7 -pady 7

    button $creatFrame.okbutton -text "OK" -command ::HVToolSet::okcall
    pack $creatFrame.okbutton -side top 
}

proc ::HVToolSet::okcall {} {
    ::HVToolSet::checkRun "right"
}

proc ::HVToolSet::checkRun {val} {
    set abc 10
    ::newspace::exec $abc  # another name space method calling
}

::HVToolSet::Main

首先,映射并不精确。你正在从一个没有类的系统转移到一个有类的系统,这是一个基本的微妙的区别

然而,粗略地说,过程变成了方法,命名空间变成了类。这至少是做什么的第一个近似值:

package require Itcl

itcl::class HVToolSet {
    # Shared over all instances (and unused otherwise?!)
    common variable tab_frame ""
    # Specific to each instance of this class
    private variable base ""

    # 'Main' seemed to be a constructor of some sort
    constructor {{win .main}} {
        if {[winfo exists $win]} {
            destroy $win
        }
        set base [toplevel $win]  
        set x 200
        set y 200
        wm geometry $base ${x}x${y}+100+0  
        wm title $base "Chevron's Build Effective Stress Results Tool" 
        wm focusmodel $base passive    
        set creatFrame [frame $base.mnFrame]
        pack $creatFrame -side top -anchor nw -expand 1 -fill both -padx 7 -pady 7

        button $creatFrame.okbutton -text "OK" -command [itcl::code okcall]
        pack $creatFrame.okbutton -side top 
    }

    # Obvious destructor...
    destructor {
        destroy $base
    }

    # Callback, best done as private method
    private method okcall {} {
        $this checkRun "right"
    }

    # Public method...
    method checkRun {val} {
        set abc 10
        ::newspace::exec $abc  ; # another name space method calling
    }
}

# Make an instance of the class that operates with the window .main
HVToolSet myInstance .main

弄清楚什么是构造函数,什么是私有方法,什么是公共方法需要一些思考。一般来说,构造函数创建并初始化对象,私有方法只在类内有意义(例如,处理回调或重构复杂的对象),而公共方法在外部调用时可能意味着什么。

我一直认为[incr Tcl]是Tcl的扩展。我建议在开始时添加一个
包require Itcl
。如果过程来自其他名称空间,那么过程如何表示过程调用?