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

How to make my Tcl/Tk wish application print debug stuff to console?

我有这个程序:

#!/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 被构建为没有真正控制台的应用程序。这通常很有用,因为它可以防止 window 在人们使用以 Tcl/Tk 编写的应用程序时弹出,但在这种情况下,这意味着它不会写入 PowerShell 控制台可以看到它的地方。相反,它提供了一个伪造的类似控制台的东西,在交互使用时默认显示,但在提供脚本时隐藏(假设脚本是一个应用程序,这是最常见的情况)。您可以使用 console show 命令显示该假控制台,但输出实际上仍不会提供给 PowerShell。 (需要用DDE或COM与之交互,与Tcl的使用本身就是一个比较大的话题。)

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