如何使用Tcl / Tk获取焦点的当前窗口。 我尝试使用focus命令,但它返回并清空字符串。
我在同一个愿望会话中有多个窗口。每个窗口都有 同一组按钮但数据不同。我需要找出答案 按下按钮的窗口的路径。
答案 0 :(得分:4)
如果没有Tk小部件具有焦点,则不带参数的focus
命令将返回具有焦点的当前Tk小部件或空结果。您可以通过启动Tk并打包一些窗口进行测试,然后使用after 2000 {puts [focus]}
并在2秒内点击一个窗口。
然而!通过绑定按钮命令并将其自身传递给命令过程,您希望获得更好的声音:
pack [button .b -text Click -command [list Click .b]]
proc Click {widget args} {puts [list $widget $args [focus]]}
如果您在其中添加条目小部件,您会发现单击它时焦点不一定等于按钮小部件。这需要先按下按钮。
答案 1 :(得分:0)
在寻找其他东西的同时,我遇到了这个,虽然它有点老了......在Tcl中,有更好的方法来做到这一点。对于 有一点,你不能确定"活动窗口"是脚本运行时所需的窗口。知道按下哪个窗口/按钮的方法是将其嵌入脚本代码中。使用" -command"将代码附加到Tk窗口/窗口小部件时参数,您可以使用" [list mycommand uniqueid]"之类的东西,并且Tcl解释器会在执行之前追加任何记录的参数。一个很好的例子就是在Tcl中创建一个TCP套接字服务器。该命令是" socket -server< procname> < port>",其中< procname>每当客户端尝试连接到< port>时就会被调用。但它不一定是一个简单的procname,它可以是任何可以eval的Tcl命令:" socket -server [list myserver foo bar] 12344"将在端口12345上创建一个侦听套接字。当客户端尝试连接到服务器时,Tcl将调用(从技术上讲,它将通过" eval"" myserver foo bar<#34; myserver foo bar< ;陈GT; <地址> < port>",其中chan,addr和port是socket命令添加到命令的参数。这些都记录在Tcl套接字命令页面中。
这里的重要部分是要了解Tcl调用" myserver"使用您给出的参数然后将附加参数附加到结尾。然后,您可以使用" socket -server myserver foo baz 12346"侦听另一个套接字,它将侦听端口12346,当客户端连接时,它将调用/ eval" myserver foo baz<陈GT; <地址> <端口>&#34 ;.然后你可以写一个" myserver" proc as" proc myserver {argFoo argBar argChan argAddr argPort} {if {$argBar eq "bar"} {puts "do somthing"} else if {$argBar eq "baz"} {puts "do something else"} else {puts "Whatcha' talkin' about, foo'!?"}}
"。
对于Tk按钮示例:
button .pressme -text "Press Me!" -command [list cmdYouPressed [pid]]
proc cmdYouPressed {argPID args} {
puts "You pressed the button for $argPID!"
}
如果你在多个不同的Tcl / Tk代理中运行这个片段,你可以告诉哪个进程ID被压了(这就是[pid]的用途)来知道在哪个运行脚本中按下了哪个按钮。当然,您可以创建自己的唯一标识符,而不是使用[pid],就像我使用foo bar / baz套接字示例一样。
这样做可以消除许多只是试图获取活动窗口的问题,例如"如果窗口在命令运行时未处于活动状态会发生什么,例如,如果您有某种自动化/远程控制进行并且它响应背景窗口?"它还可以让您在运行多个版本的脚本时不必尝试确定窗口/资源ID - 每个版本都有自己的系统唯一进程ID。
(对不起,如果我不清楚或太简洁..我的键盘工作不正常,这就是为什么我在寻找其他东西,帮助我"自动更正"错误..)