0

我的表单是一个基本的两个标签框架,其中一个包含复选框,另一个是图像。在这两个框架下方是一个后退和一个开始按钮。该窗口已预设,因此无法更改,但是当按下开始按钮时,屏幕上会出现其他小部件。但是,我希望仅在选中复选框并单击开始按钮后才创建小部件并将其放置在屏幕上。然后开始按钮调用一个名为“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'调用文件

谢谢您的帮助!

4

2 回答 2

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 的助记符,但肯定不是必需的。(虽然将路径名绑定到回调list而不是使用全局/命名空间变量,但比使用字符串替换编写回调更容易。)

于 2013-07-30T19:54:23.257 回答
1

您是否在 proc 中创建UTA 变量?如果是这样,你也必须在那里声明它是全局的。

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

于 2013-07-30T18:33:12.413 回答