0

我对 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
4

1 回答 1

1

首先,映射不准确。你正在从一个没有类的系统转变为一个有类的系统,这是一个根本而微妙的区别。

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

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

弄清楚什么需要是构造函数,什么是私有方法以及什么是公共方法可能需要一些思考。通常,构造函数创建和初始化事物,私有方法仅在类中有意义(例如,处理回调或重构出复杂的东西),而公共方法在外部调用时可能有意义。

于 2013-06-05T13:00:49.583 回答