我是初学者,运行tcl / tk脚本。在我的脚本中,我创建了一个弹出窗口来选择要打开的文件,然后将此文件路径提供给源函数。我希望这个脚本能够逐步运行,但是在我选择任何文件之前,源功能正在运行。我也尝试过使用vwait功能。不幸的是它没有在第一轮运行。但在第二次运行脚本是按照愿望工作。有人可以帮我运行这个脚本吗?
destroy .buttons
toplevel .buttons -width 400 -height 100 -background red -relief ridge -borderwidth 8 -padx 10 -pady 10
wm title .buttons "Select a file containing nodes coordinates"
wm geometry .buttons 350x81
set count 0
proc add_button {title command} {
global count
button .buttons.$count -text $title -command $command
pack .buttons.$count -side top -pady 1 -padx 1 -fill x
incr count
}
set types { {{TCL Scripts} {.tcl}} }
add_button "File name" {set accept_button [tk_getOpenFile -filetypes $types]
puts "the path is: $accept_button"
destroy .buttons}
add_button "Exit" {destroy .buttons}
#puts above------------------------
#vwait [namespace which -variable accept_button]
#puts below-----------------------
source "$accept_button"
puts "the src is: $accept_button"

答案 0 :(得分:0)
看起来你错过了Tk中事件驱动编程的想法。 让我们试着找出你的脚本中发生了什么。当你运行它时,唯一应该做的就是:为用户构建带有小部件的窗口,并将脚本绑定到小部件事件。就这些。之后该程序只是在等待用户操作。绑定到按钮的命令不会立即评估。
在您的情况下,所有使用所选文件的工作应该在用户选择之后。您应该从按钮的命令运行文件读取。尝试使用tclsh
运行此脚本package require Tk
destroy .buttons
toplevel .buttons -width 400 -height 100 -background red -relief ridge -borderwidth 8 -padx 10 -pady 10
wm title .buttons "Select a file containing nodes coordinates"
wm geometry .buttons 350x81
set count 0
proc add_button {title command} {
global count
button .buttons.$count -text $title -command $command
pack .buttons.$count -side top -pady 1 -padx 1 -fill x
incr count
}
set types { {{TCL Scripts} {.tcl}} }
add_button "File name" {set accept_button [tk_getOpenFile -filetypes $types]
puts "the path is: $accept_button"
what_program_should_do_after_file_is_chosen $accept_button
destroy .buttons}
add_button "Exit" {destroy .buttons}
proc what_program_should_do_after_file_is_chosen {path} {
puts "You've chose file: $path"
}
vwait forever