Tcl 将过程链接到按钮

Tcl 将过程链接到按钮,tcl,procedure,Tcl,Procedure,现在,我已经创建了与最初使用tcl gui构建器相同的用户界面。然而,在如何构建界面和小部件之间的间距方面,它变得有限。现在我已经创建了我的界面,我正在寻找创建一个特定小部件的过程块。例如,我希望退出按钮退出程序 为此,我创建了以下程序: proc btnQuit args { exit } 这不会导致语法或运行时错误,但是,当按下按钮时,程序不会退出。这是最简单的情况,因为还有其他更复杂的情况,所以-command标志不会应用于所有情况 想法 下面是我的全部代码。这只是打开用户界面 #Inc

现在,我已经创建了与最初使用tcl gui构建器相同的用户界面。然而,在如何构建界面和小部件之间的间距方面,它变得有限。现在我已经创建了我的界面,我正在寻找创建一个特定小部件的过程块。例如,我希望退出按钮退出程序

为此,我创建了以下程序:

proc btnQuit args {
exit
}
这不会导致语法或运行时错误,但是,当按下按钮时,程序不会退出。这是最简单的情况,因为还有其他更复杂的情况,所以-command标志不会应用于所有情况

想法

下面是我的全部代码。这只是打开用户界面

#Includes the necessary packages
package require BWidget
package require Tk

namespace eval Main_Menu {}

#DO NOT MODIFY!! Graphical User Interface Code DO NOT MODIFY!!

#Limit the size of window
wm maxsize . 475 180    ;#x-500, y-210
wm minsize . 475 180    ;#x-500, y-210

#[Device name] Test Frame w/ associated check boxes
labelframe .lblfrmSelection     -text "Testable Devices" -padx 1 -relief groove -height 175 -width 200
button .btnDualUTA              -text "Dual UTA" -padx 5 -anchor "center" -justify "center" -padx 3
button .btnTProbe               -text "T-Probe" -padx 5 -anchor "center" -justify "center" -padx 7
button .btnOctal                -text "Octal" -padx 5 -anchor "center" -justify "center" -padx 14
button .btnUniversal            -text "Universal" -padx 5 -anchor "center" -justify "center"
button .btnQuit                 -text "Exit" -padx 5 -anchor "center" -justify "center" -padx 18

#Setup second frame with image label
labelframe .lblfrmHWSetup   -text "Hardware Setup" -padx 1 -relief groove -height 200 -width 175
image create photo          glcomm.gif
label .lblSetup             -text "Image goes here"

#*************** Render User Environment ******************
#Create Device Test Interface with check boxes in frame.
place .lblfrmSelection  -anchor nw -x 5 -y 1 -width 165 -height 175
place .btnDualUTA       -in .lblfrmSelection -x 40 -y 15 -anchor "w" 
place .btnTProbe        -in .lblfrmSelection -x 40 -y 46 -anchor "w" 
place .btnOctal         -in .lblfrmSelection -x 40 -y 76 -anchor "w" 
place .btnUniversal     -in .lblfrmSelection -x 40 -y 106 -anchor "w" 
place .btnQuit          -in .lblfrmSelection -x 40 -y 136 -anchor "w"

#Create label frame "Hardware Setup"
place .lblfrmHWSetup    -anchor nw -x 170 -y 1 -height 175 -width 300
place .lblSetup         -in .lblfrmHWSetup -x 171 -y 2

# MODIFY BELOW THIS LINE!! MODIFY BELOW THIS LINE!!

proc btnQuit args {
exit
}

您还没有显示按钮是如何创建的,但您需要的是
-command
选项

$ tclsh <<'END'
package req Tk
proc btnQuit args {exit}
button .b -text Quit -command btnQuit
pack .b
END

请注意,这将在全局命名空间中查找“btnQuit”过程。如果使用名称空间,则必须完全限定命令名。单击按钮时会引发错误(无效的命令名“btnQuit”)

在这种情况下,您需要

button .b -text Quit -command MySpace::btnQuit

如果需要将参数传递给btnQuit进程,您可以执行以下操作

button .b -text Quit -command [list btnQuit $local_var1 $local_var2]

不同的引用机制导致变量在不同时间被替换:

  • 创建按钮时的第一个按钮
  • 第二次单击按钮时

我已经提供了作为我的用户界面的代码。您所说的全局命名空间中的是什么意思?我实际上不理解名称空间是什么,尽管我的代码中有名称空间,但看起来您所需要的只是
。btnQuit configure-command btnQuit
,在您的btnQuit过程之后,它似乎什么都不做。proc btnQuit{.btnQuit configure-command btnQuit}程序不退出。我还试着从末尾删除“btnQuit”。当然,这不会退出:您执行了exit命令。执行此操作:
proc quit{}{exit}。btnQuit configure-command quit
我大约一个小时前才知道。感谢您解决了这个问题,很高兴看到我的额外努力和在线搜索得到了类似的结果。:-)
button .b -text Quit -command MySpace::btnQuit
button .b -text Quit -command [list btnQuit $local_var1 $local_var2]
button .b -text Quit -command {btnQuit $global_var1 $global_var2}