Tcl/Tk:获取调整大小窗口的默认位置和/或是否使用默认位置

问题描述

我正在创建一个多窗口应用程序(跨平台(X11、macOS、Windows)、未指定的窗口管理器),其中每个窗口对应一个文档。 在创建新文档(以及窗口)时,窗口管理器应该可以自由地将窗口放置在它认为合适的任何地方。 但是,如果用户手动将窗口移动到某个位置,则该位置应与文档一起保存(因此在重新打开文档时,它会与上次保存的位置完全相同)。

(初始)窗口大小是固定的。

为了找出当前位置,我可以使用wm geometrywinfo geometry,两者返回的结果略有不同(前者有装饰(如边框和菜单),后者没有) . 据我了解,如果我想恢复窗口的位置,我需要 wm geometry 的结果。

但是,当我创建一个初始窗口并调整其大小时,winfo geometry 返回正确的位置(但没有装饰),而 wm geometry 不会。

# hide the default window
wm withdraw .

toplevel .my
wm geometry .my 200x100

# the following prints "1x1+0+0" for both geometries
puts "[wm geometry .my] [winfo geometry .my]"

raise .my
# this prints something like "200x100+0+0 200x100+860+542"
puts "[wm geometry .my] [winfo geometry .my]"

如果我手动移动窗口,然后再次调用 [wm geometry .my],它现在可以正确报告窗口所在的任何位置。

所以我的问题是:

在我使用 wm geometry ${w}x${h} 调整窗口大小后,有没有办法获取窗口位置(由窗口管理器设置)?

或者,有没有办法(从窗口本身)找出用户是否已将其移动到其他地方? (所以我可以将位置保存为“未定义,让 WM 做他们的事”)。 理想情况下,这样的解决方案将处理用户手动将窗口移动到 +0+0 位置的情况,而不是完全不移动窗口的情况。

我对获取此信息特别感兴趣,而不必绑定到 <<Configure>>(或其他一些)事件,以便检测用户是否触摸了窗口。

旁注:设置窗口尺寸

我知道我可以使用 wm geometry ${w}x${h} 以及使用 toplevel .wm -width $w -height $h 创建窗口时设置窗口尺寸。 执行后者时,wm geometry 返回正确的窗口位置,但两者之间还有什么其他区别?

解决方法

我认为更广泛地使用 winfo 是您所需要的: https://www.tcl.tk/man/tcl8.6/TkCmd/winfo.htm

set _x [winfo rootx .my]

上面的命令返回左上角的X坐标

winfo rooty .my

和之前一样,返回左上角的Y坐标

winfo width .my

winfo height .my

对于这些不言自明的命令也是如此。

您可以实时保存任何窗口的位置和大小,以便以后重新打开时恢复。