如何使我的Tcl/Tk应用程序将调试内容打印到控制台?

如何使我的Tcl/Tk应用程序将调试内容打印到控制台?,tcl,tk,Tcl,Tk,我有这个计划: #!/usr/local/bin/wish package require Tk # Window properties wm title . "Jau" wm minsize . 320 240 # main frame grid [ttk::frame .f -padding "0 0 0 0"] -column 0 -row 0 -sticky nwes grid columnconfigure . 0 -weight 1; grid rowconfigure . 0

我有这个计划:

#!/usr/local/bin/wish
package require Tk

# Window properties
wm title . "Jau"
wm minsize . 320 240

# main frame
grid [ttk::frame .f -padding "0 0 0 0"] -column 0 -row 0 -sticky nwes
grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1

# drawing canvas
canvas .f.canvas -bg darkgreen
place .f.canvas -relwidth 1.0 -relheight 1.0

# cmd
ttk::entry .f.cmd -textvar cmd -width 30
pack .f.cmd -anchor s -side top

puts stderr "hello world"
当我运行它时,控制台中没有打印hello world。有没有办法让puts stderr开始工作

使用Win10和PowerShell。

tl;dr:最简单的方法是使用tclsh而不是wish运行应用程序。否则,请在脚本中使用console show

在Windows上,wish是一个没有真正控制台的应用程序。这通常很有用,因为它可以防止人们在使用用Tcl/Tk编写的应用程序时弹出窗口,但在这种情况下,这意味着它不会写入PowerShell控制台可以看到它的地方。相反,它提供了一个类似控制台的东西,在交互使用时默认显示,但在假定脚本是应用程序的情况下提供脚本时隐藏,这是非常常见的情况。您可以使用consoleshow命令显示这个假控制台,但输出仍然无法实际提供给PowerShell。它需要使用DDE或COM与之交互,Tcl使用DDE或COM本身就是一个相当大的主题

如果您希望能够通过Windows上的标准I/O通道直接与Tcl解释器对话,则需要使用tclsh,因为它将这些通道配置为实际存在。您已经拥有了所需的其余部分:包require Tk足以加载Tk包,并将tclsh转换为与安装GUI处理事件循环几乎相同的工作方式,从而实现主顶级。关键的区别在于,如果您从“开始”菜单或桌面快捷方式这样启动脚本,即使从未使用puts写入输出,您也会看到一个额外的控制台窗口弹出,但当您希望写入的输出显示在外部世界时,这正是您所需要的。

tl;dr:最简单的方法是使用tclsh而不是wish运行应用程序。否则,请在脚本中使用console show

在Windows上,wish是一个没有真正控制台的应用程序。这通常很有用,因为它可以防止人们在使用用Tcl/Tk编写的应用程序时弹出窗口,但在这种情况下,这意味着它不会写入PowerShell控制台可以看到它的地方。相反,它提供了一个类似控制台的东西,在交互使用时默认显示,但在假定脚本是应用程序的情况下提供脚本时隐藏,这是非常常见的情况。您可以使用consoleshow命令显示这个假控制台,但输出仍然无法实际提供给PowerShell。它需要使用DDE或COM与之交互,Tcl使用DDE或COM本身就是一个相当大的主题


如果您希望能够通过Windows上的标准I/O通道直接与Tcl解释器对话,则需要使用tclsh,因为它将这些通道配置为实际存在。您已经拥有了所需的其余部分:包require Tk足以加载Tk包,并将tclsh转换为与安装GUI处理事件循环几乎相同的工作方式,从而实现主顶级。窗口等。关键的区别在于,如果您从“开始”菜单或桌面快捷方式这样的地方启动脚本,您会看到一个额外的控制台窗口弹出,即使没有使用puts写入输出,但当您希望写入的输出显示在外部世界时,这就是您需要的。

我选择在开发期间从控制台运行“tclsh.exe.\jau.tcl”。控制台输出是为在管道中运行应用程序的开发人员和可能的超级用户准备的console show“对于天真的用户来说会很烦人,对于超级用户来说是不可能的。@Andreas我怀疑这对你来说是正确的答案。我只是想确保其他替代方案也被提及;有相关问题的人可能会发现它们很有用,而背景也说明了为什么需要这个选择。我选择在开发过程中从控制台运行“tclsh.exe。\jau.tcl”。控制台输出是为在管道中运行应用程序的开发人员和可能的超级用户准备的console show“对于天真的用户来说会很烦人,对于超级用户来说是不可能的。@Andreas我怀疑这对你来说是正确的答案。我只是想确保其他替代方案也被提及;有相关问题的人可能会发现它们很有用,背景也说明了为什么这个选择是必要的。