0

如何使用 Tcl/Tk 获得当前窗口的焦点。我尝试使用 focus 命令,但它返回和空字符串。

我在同一个愿望会话中有多个窗口。每个窗口都有相同的按钮集,但数据不同。我需要找出按下按钮的窗口的路径。

4

2 回答 2

4

不带参数的focus命令返回当前具有焦点的 Tk 小部件,如果没有 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]]}

如果您在其中添加一个条目小部件,您会发现当您单击它时焦点不一定等于按钮小部件。这需要首先点击按钮。

于 2012-04-18T16:16:00.063 回答
0

在寻找其他东西时,我遇到了这个,虽然它有点老了..在 Tcl 中,有更好的方法来做到这一点。一方面,您无法确定“活动窗口”是脚本运行时所需的窗口。知道按下了哪个窗口/按钮的方法是将其嵌入脚本代码中。当您使用“-command”参数将代码附加到 Tk 窗口/小部件时,您可以使用“[list mycommand uniqueid]”之类的东西,Tcl 解释器将在执行之前附加任何记录的参数。一个很好的例子是在 Tcl 中创建一个 TCP 套接字服务器。该命令是“socket -server <procname> <port>”,只要客户端尝试连接到 <port>,就会调用 <procname>。但它不必是一个简单的 procname,它可以是任何可以评估的 Tcl 命令:“socket -server [list myserver foo bar] 12344”将在端口 12345 上创建一个侦听套接字。当客户端尝试连接到服务器时,Tcl 将调用(从技术上讲,它将通过 "eval") "myserver foo bar <chan> <addr> <port>" 运行,其中 chan、addr 和 port 是 socket 命令添加到命令的参数。这些都记录在 Tcl 套接字命令页面中。addr 和 port 是 socket 命令添加到命令中的参数。这些都记录在 Tcl 套接字命令页面中。addr 和 port 是 socket 命令添加到命令中的参数。这些都记录在 Tcl 套接字命令页面中。

这里重要的部分是理解 Tcl 使用您提供的参数调用“myserver”,然后将附加参数附加到末尾。然后,您可以使用“socket -server myserver foo baz 12346”监听另一个套接字,该套接字将监听端口 12346,当客户端连接时,它将调用/eval“myserver foo baz <chan> <addr> <port>” . 然后,您可以将单个“myserver”过程编写为“ 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。

(对不起,如果我不清楚或太简洁......我的键盘工作不正常,这就是为什么我正在寻找其他东西,以帮助我“自动更正”错误......)

于 2017-04-27T21:54:20.633 回答