如何解决Tcl/Tk:获取调整大小窗口的默认位置和/或是否使用默认位置
我正在创建一个多窗口应用程序(跨平台(X11、macOS、Windows)、未指定的窗口管理器),其中每个窗口对应一个文档。 在创建新文档(以及窗口)时,窗口管理器应该可以自由地将窗口放置在它认为合适的任何地方。 但是,如果用户手动将窗口移动到某个位置,则该位置应与文档一起保存(因此在重新打开文档时,它会与上次保存的位置完全相同)。
(初始)窗口大小是固定的。
为了找出当前位置,我可以使用wm geometry
或winfo 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
对于这些不言自明的命令也是如此。
您可以实时保存任何窗口的位置和大小,以便以后重新打开时恢复。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。