Tcl 从子例程创建并放置小部件

Tcl 从子例程创建并放置小部件,tcl,Tcl,我的表单是一个基本的两个标签框架,其中一个包含复选框,另一个是图像。在这两个框架下面是后退和开始按钮。该窗口是预设的,因此无法更改,但当按下“开始”按钮时,屏幕上会显示其他窗口小部件。但是,我希望窗口小部件仅在选中复选框并单击开始按钮后创建并放置在屏幕上。然后,“开始”按钮调用名为“平衡”的函数。在这段代码中,它创建了新的小部件并将它们放在窗口上。但是,它返回一个错误:“错误的窗口路径名'.lblfrmProgress'” 以上是在UTA别名下创建窗口的代码部分。我认为这个窗口是顶级窗口,因此可

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

以上是在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”调用该文件

谢谢你的帮助

是否在进程中创建UTA变量?如果是这样,你也必须在那里宣布它是全球性的

global
命令使用一个或多个变量名,因此
global UTA.dual\u UTA
没有意义。

是否在进程中创建UTA变量?如果是这样,你也必须在那里宣布它是全球性的


global
命令使用一个或多个变量名,因此
global-UTA.dual\u-UTA
没有意义。

您对
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 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
调用中使用,以避免经常编写长的小部件路径。在我看来,它只是稍微有点助记忆,但肯定不是必需的。(将路径名绑定到回调中——使用上面的
list
而不是使用全局/名称空间变量是更好的风格,并且比使用字符串替换编写回调问题更少。)

您使用
全局
似乎有点不合适。特别是,
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 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
调用中使用,以避免经常编写长的小部件路径。在我看来,它只是稍微有点助记忆,但肯定不是必需的。(将路径名绑定到回调中——使用上面的
list
而不是使用全局/命名空间变量是更好的风格,并且比使用字符串替换编写回调问题更少。)

我不在进程中创建UTA变量。这个变量是在主文件的开头创建的,因此我可以创建一个新窗口。一旦所有小部件都制作好并放在窗口上,就会根据调用它们的方式调用过程。选中“balanced”(平衡)复选框并按下start(开始)按钮时,它将生成此新文件。需要这个新文件将特定于测试的小部件添加到接口中。但要将其添加到已经可见的接口中,它必须通过查看变量$UTA来引用它。我想我是想引用这个窗口?我没有在进程中创建UTA变量。这个变量是在主文件的开头创建的,因此我可以创建一个新窗口。一旦所有小部件都制作好并放在窗口上,就会根据调用它们的方式调用过程。选中“balanced”(平衡)复选框并按下start(开始)按钮时,它将生成此新文件。需要这个新文件将特定于测试的小部件添加到接口中。但要将其添加到已经可见的接口中,它必须通过查看变量$UTA来引用它。我想我是想参考这个窗口?你能纠正任何误解并回答这些问题吗?1.全局命令用于已通过变量命令或set命令建立的变量?2.wm标题$UTA{设备:双UTA}忽略问题2。我知道那有什么用。你能纠正任何误解并回答这些问题吗?1.全局命令用于已通过变量命令或set命令建立的变量?2.wm标题$UTA{设备:双UTA}忽略问题2。我知道那有什么用。Lol当我尝试将变量值传递给其他文件(如UTA to Balanced.tcl)时,tcl返回以下错误:“错误的#args:应该是‘源文件名’”。如何避免此问题?当我尝试将变量值传递给其他文件(如