gpt4 book ai didi

Tcl/Tk - 如何在使用 eval 执行命令后获得提示?

转载 作者:行者123 更新时间:2023-12-02 08:54:48 28 4
gpt4 key购买 nike

下面给出了重现我的问题的代码。我将该文件命名为 test.tcl

#-------------------------------------------------------------------
# test.tcl
#-------------------------------------------------------------------

namespace eval Gui {
}

proc Gui::test {} {
toplevel .test
wm title .test "Test"
wm resizable .test 0 0 ;# not resizable

# create a frame to hold the check widgets
set f [frame .test.boolean -borderwidth 10]
pack $f -side top

# OK and Cancel buttons
button .test.ok -text "OK" -command [list Gui::Ok .test ]
button .test.cancel -text "Cancel" -command [list Gui::cancel .test ]
pack .test.cancel .test.ok -side right

bind .test <Return> {Gui::Ok .test ; break}
bind .test <Escape> {Gui::cancel .test ; break}
}

proc Gui::Ok { arg } {
set x [list puts "hello world!"]
eval $x
destroy $arg
}

proc Gui::cancel { arg } {
destroy $arg
}

#-------------------------------------------------------------------
# Gui main window
#-------------------------------------------------------------------
proc Gui::initialize { } {

# build the frame which contains menu options
frame .mbar -relief raised -bd 2
frame .mdummy -width 200 -height 240
pack .mbar .mdummy -side top -fill x

# menu options
menubutton .mbar.command -text Command -underline 0 -menu .mbar.command.menu
pack .mbar.command -side left

# menu under command options
menu .mbar.command.menu -tearoff 0
.mbar.command.menu add command -label "Test..." -command [list Gui::test]
}

#-------------------------------------------------------------------
# main code
#-------------------------------------------------------------------
Gui::initialize

当我打字时

% wish
% source test.tcl
%

然后我单击Command -> Test ... -> OK 这给了我

% hello world!

在打印 hello world! 后,我没有收到提示 %。尽管我仍然可以在该空间中执行 tcl 命令。例如:

% hello world!
puts "hi"
hi
%

返回提示。

我的问题:如何在 tcl/tk 执行打印 hello world!

eval 命令后恢复提示符 %

最佳答案

提示符 % 来自 tcl 解释器并显示在终端中,只是因为它处于交互模式。如果您以 wish test.tcl 形式运行脚本,您将永远不会得到 %

您可以实现自己的交互模式,并在应用程序的所有初始化步骤之后调用它。这是如何完成的示例:

proc Gui::interactive {} {
set prompt1 "tcl>"
set prompt2 "?"
set cmd {}
set prompt "$prompt1 "
fconfigure stdin -blocking false -buffering line
fileevent stdin readable {set Gui::stdinReady 1}
while true {
puts -nonewline $prompt
flush stdout
vwait Gui::stdinReady
set str [gets stdin]
lappend cmd $str
set cmdStr [join $cmd "\n"]
if {[info complete $cmdStr]} {
set cmd {}
if {$cmdStr != ""} {
if {[catch {eval $cmdStr} result]} {
puts stderr "ERROR: $result"
} elseif {$result != ""} {
puts $result
}
}
set prompt "$prompt1 "
} else {
set prompt "$prompt2 "
}
if {[eof stdin]} {
puts ""
break
}
}
}

只需在 Gui::test 执行后调用此函数,您就会得到自己的提示。但即使在这个例子中,如果文本从其他过程打印到终端,提示也不会被重新绘制。

关于Tcl/Tk - 如何在使用 eval 执行命令后获得提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758374/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com