从子例程创建和放置小部件

时间:2013-07-30 15:53:16

标签: tcl

我的表单是一个基本的两个标签框架,其中一个包含复选框,另一个是图像。在这两个帧下面是后退和开始按钮。窗口是预设的,因此无法更改,但按下开始按钮时,屏幕上会显示其他窗口小部件。但是,我希望仅在选中复选框并单击开始按钮后才创建窗口小部件并将其放置在屏幕上。然后,开始按钮调用一个名为“Balanced”的函数。在此代码中,它创建新的小部件并将它们放在窗口上。但是,它会返回错误:“错误的窗口路径名称'.lblfrmProgress'”

#Set Dual UTA Window as top-level
set UTA .dual_uta
wm state . withdrawn
catch {destroy $UTA}
toplevel $UTA

#Window Properties
wm title  $UTA {Device: Dual UTA}
wm maxsize $UTA 522 231 ;#x-500, y-231
wm minsize $UTA 522 231 ;#x-500, y-231

以上是代码的一部分,它在UTA的别名下创建一个窗口。我认为这个窗口是顶级窗口,因此可以使用$ UTA引用。[pathname]。

global UTA .dual_uta
#**************** DO NOT MODIFY - USER INTERFACE CODE *******************

    #Setup window with labels to show progress
    labelframe $UTA.lblfrmProgress  -text "Test Progress" -padx 1 -relief groove -height 145 -width 520
    label $UTA.lblUTASetup          -text "Dual UTA setup according to image"
    label $UTA.lblVQuadStart        -text "VQuad is initializing"
    label $UTA.lblVQTStart          -text "VQT is initializing"
    label $UTA.lblLMC               -text "Load 'Balanced' Master Configuration"
    label $UTA.lblTxRx1             -text "Side 1 Tx - Side 2 Rx"
    label $UTA.lblTxRx2             -text "Side 1 Rx - Side 2 Tx"

我是否错误地引用了窗口变量名称?我是否需要通过过程调用传递窗口变量?我只是使用'source Balanced.tcl'

来调用该文件

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您对global的使用似乎有些偏差。特别是,global的每个参数都是要映射的变量的名称;初始化应该单独完成。或者你可以将变量放入并(可选)使用variable命令初始化它:

proc whatever {} {
    variable UTA .dual_uta

    destroy $UTA;   # No error if $UTA doesn't exist
    toplevel $UTA
    wm title $UTA {Device: Dual UTA}
    labelframe $UTA.lblfrmProgress  -text "Test Progress" \
            -padx 1 -relief groove -height 145 -width 520
    # Etc.
}

通常认为在封闭命名空间(即全局命名空间variable中)使用::形式更好,除非你另有说明)并且只在过程中使用单个参数形式

variable UTA .dual_uta
proc whatever {} {
    variable UTA

    destroy $UTA
    toplevel $UTA
    wm title $UTA {Device: Dual UTA}
    labelframe $UTA.lblfrmProgress  -text "Test Progress" \
            -padx 1 -relief groove -height 145 -width 520
    # Etc.
}

我自己,我将构建过程,以便构建的窗口层次结构的“根名称”是过程的参数,在创建过程中将名称绑定到任何回调中:

proc whatever {UTA} {
    destroy $UTA
    toplevel $UTA
    wm title $UTA {Device: Dual UTA}
    labelframe $UTA.lblfrmProgress  -text "Test Progress" \
            -padx 1 -relief groove -height 145 -width 520
    # Etc.
    button $UTA.thingamijig -text "Fluffy Bunny" -command [list doTheCallback $UTA]
    # ...
}

我还会在变量中保存小部件的名称,以便在以后的pack / grid调用中使用,以避免必须经常编写长小部件路径。它只是稍微更麻烦的IMO,但肯定没有必要。 (将路径名绑定到回调àla使用上面的list而不是使用全局/命名空间变量是更好的风格,并且比使用字符串替换编写回调更少问题。)

答案 1 :(得分:1)

你在proc中创建 UTA变量吗?如果是这样,你必须在那里宣布它是全球性的。

global命令带有一个或多个变量名,因此global UTA .dual_uta没有意义。