【问题标题】:When and how to set window size using Tk何时以及如何使用 Tk 设置窗口大小
【发布时间】:2016-04-04 01:20:54
【问题描述】:

我正在编写一个脚本来将内容输出到一个窗口,该窗口包含一个 Tkhtml 小部件和一个在 ttk::panedwindow 中相互叠加显示的文本小部件。这两个小部件都可以垂直和水平滚动。还有一个按钮允许用户清除文本小部件。

我正在运行 Ubuntu 的笔记本电脑上进行一些开发。窗口管理器允许 2x2 阵列中的四个桌面工作区,当第一次显示 GUI 时,底部五分之一左右从我正在使用的工作区流到下面的工作区。不得不四处调整窗口大小以使其足够短以适合屏幕,这很烦人,所以我想调整它的大小。

(我认为)我大致知道如何执行此操作,即绑定到适当的事件,以便我可以在第一次显示窗口时运行脚本。 (从脚本中重置绑定,使其只触发一次。)我相信“适当的事件”是<Map>,但是当第一次映射窗口时,两个小部件的高度为零(如[winfo height] 报告的那样) )。我尝试绑定到<Expose>,这似乎可行,([winfo height] 返回合理的数字,)所以:

问题 1:我应该绑定哪个事件?

当绑定触发时,[wm geometry] 将几何报告为 815x1029+49+24,[winfo height] 报告两个小部件的两个高度为 600 和 366,[wm screenheight] 返回高度为 800。我知道那里是 GUI 中的各种其他点点滴滴,所以我对初始布局中有 63 个像素下落不明并不感到惊讶。我假设在调整大小后我需要相同数量的空间,所以我应该请求 815x737+49+24 的几何图形,但是当我这样做时,一条条子(大约是较低的水平滚动条)仍然会渗入下一个工作区。

通过手动处理,我知道当一切都很好地适合屏幕时,几何图形应该是 815x717+49+24,所以我在允许“其他位”的空间量中添加了 20 的软糖因子和 GUI 的碎片”。这工作正常,但似乎有点不雅(大量的英国轻描淡写:-)),所以:

问题 2:我错过了什么,需要使用软糖因素?

我在 Ubuntu 12.04.5 LTS 上使用 Tk 8.6.1。我正在使用 Compiz 窗口管理器的 0.9.7.12 版本。

更新

让我感到震惊的是,我应该找到各种窗格的高度,而不是 Tkhtml 和文本小部件,因为这会解释滚动条和“清除”按钮。窗格高度最初是 615 和 409,但这只是意味着我必须将我的软糖因子从 20 增加到 78 才能使请求高度达到我想要的 717 值。有没有办法预测顶层请求的高度包含我的窗格窗口以使该顶层填满屏幕?

【问题讨论】:

  • winfo height 在窗口完全显示之前不会返回合理的数字。您可以使用winfo reqheight 在窗口显示之前获取窗口的请求高度。
  • @BradLanam 我原以为 <Map> 事件只会在窗口完全显示时触发,但很惊讶[winfo height] 那时没有返回合理的数字。 <Expose> 事件似乎触发得足够晚,以便有合理的数据可以恢复,但我很惊讶我需要使用它,特别是考虑到 Tk documentation 中的这一声明:“客户端应用程序通常不需要处理 Expose 事件,因为 Tk 在内部处理它们”。
  • @BradLanam [winfo reqheight] 没有返回任何有用的信息,因为我没有要求任何特定的高度。
  • reqheight 不绑定到用户请求的高度。它是 tk 的打包算法要求的高度。您将<Map> 绑定到哪个窗口?您可能需要将 绑定到多个窗口并等待它们都准备好。
  • @BradLanam 我忘记了这种事情有多“有趣”。我确定上次我尝试它时,[winfo height]<Map> 绑定触发时返回 0。我已经改变了一些事情,以转储窗格窗口和每个窗格、<Map><Expose> 上的当前和请求的高度(使用[winfo height][winfo reqheight])。两个事件的相同窗口报告相同的值,并且它们始终是合理的(即非零)。以前,我只绑定到窗格窗口。

标签: tcl tk


【解决方案1】:

我建议绑定到<Map>。在尝试调整高度之前,我会等待所有:窗格窗口、主 tkhtml 窗口、文本窗口和滚动条被映射。

对于 Linux,[winfo screenheight .] 不知道已配置的任何面板,因此您必须减去这些。您可以通过创建一个窗口,执行wm attributes . -zoomed 1,然后获取窗口的几何形状来获得可用的实际屏幕高度。

窗口的标题栏和边框占用空间。这些所需的空间可以通过比较[winfo geometry .][wm geometry .]的输出来计算。

还有panedwindow 窗扇高度以及任何边距和填充。 您可以通过从[winfo height .] 中减去窗格窗口高度来计算这些总和。

这是一种始终有效的方法,但是它不是很吸引人,因为用户会看到窗口在改变大小时闪烁。

  • 最大化窗口 (wm attributes . -zoomed 1)
  • 获取窗口几何图形并解析出屏幕高度。
  • 取消最大化窗口 (wm attributes . -zoomed 0)
  • 获取窗口几何图形并替换屏幕高度 具有最大化的屏幕高度。
  • 设置窗口几何形状。

【讨论】:

  • 非常感谢@BradLanam 的建议。我认为您的建议闪烁会涉及将其排除在解决方案之外。我已经修改了绑定到窗格窗口上的<Map> 事件的方法,并将高度设置为屏幕高度减去83 的软糖因子。这在Ubuntu Linux 和Windows 上都适用。似乎不需要在窗格窗口的子级上绑定到<Map>
  • 关于,“窗口的标题栏和边框占用的空间 [that] 可以通过比较 [winfo geometry .] 和 [wm geometry .] 的输出来计算。”我试过比较输出,但我一定不明白如何做到这一点。最终,当我对窗口进行屏幕截图时,我想获得接近 widthXheight 的 Tk 窗口 widthXheight 数字。例如,屏幕截图为 1132x338。 'winfo geometry' 给出 1114x256+9+71 和 'wm geometry' 给出 97x4+0+0。仅对宽度进行数学运算:1114 plus 97=1211; 1114 97=1017,1132 1114=18。 1132 1211=-79.
  • 编辑了我的评论,将 heightXwidth 翻转为 widthXheight 并在宽度而不是高度上进行数学运算。
猜你喜欢
  • 2020-04-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2010-09-10
相关资源
最近更新 更多