tcl / tk脚本表现不尽如人意

时间:2017-04-10 20:48:18

标签: tcl tk

我是初学者,运行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"




1 个答案:

答案 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