0

我的 traitsui 应用程序中有一个用于 mayavi 场景的 tvtk SceneEditor。在定义这个编辑器时,我要求它的大小为 500x500。

由于 mayavi 工具栏,场景编辑器本身理解它在正常情况下的大小比这个小:

>>> self.scene.scene_editor.get_size()
wx.Size(500, 468)

而当窗口被放大以至于编辑器占用更多空间时,它也明白这一点

>>> self.scene.scene_editor.get_size()
wx.Size(500, 781)

但是,如果编辑器变得更小,它会拒绝占用更少的空间(即使内容可以很容易地重新缩放),因为编辑器被指定为占用 500x500。它允许调整编辑器的大小,但只是切断部分显示,直到再次放大。

我想知道是否有办法a)询问当前在屏幕上显示了多少编辑器(而不是编辑器愿意显示的最小尺寸)和b)使编辑器默认为500x500但愿意如果它变小,要求它的内容重新缩放。

我正在使用 wxpython 后端。

编辑:场景包含在一个组中也很重要layout='split'——在探索了这个问题并遇到了 wx 在添加 traitsui 小部件时生成的大量 sizer 之后,我意识到这也可能很重要。

4

1 回答 1

0

在研究了几天之后,我对 a) 部分有了答案(尽管它很老套,不一定是通用的,它可能特定于layout='split'布局)。

self.scene.scene_editor.control.Parent.Parent.Size描述了显示编辑器的视口的大小,至少与layout='split'但我可以很容易地想象它对于其他布局类型(我没有测试)会有所不同。

有了这些信息,我设法编写了一个包装器,在制作快照之前将编辑器的大小调整到至少这么小。

更多血腥细节:

与关联的sizerself.scene.scene_editor.control不是正确的,可能是因为该sizer 指的是包含编辑器的窗口,而与包含拆分器小部件内的窗口大小关联的sizer 被允许“覆盖”该窗口并忽略其大小。

我发现添加 traitsui 小部件的过程定义了如此多的框(假设小部件数量不小),结果是 wx Windows 及其相关联的 wx Sizer 的大量过剩,它们都依赖于它们的子小部件来确定当前大小,所以要控制这样的事情是非常困难的。这可能就是搪瓷存在的原因;以便用户可以明确指定这些约束。也许有一天我会将我的程序转换为使用 enaml,但对于目前运行良好的东西来说,这似乎需要付出很多努力。

我仍然没有 b) 部分的答案,所以我将这个问题悬而未决。如果有一种方法可以在构建时指定 wx sizer 的混乱,允许将此窗口的大小调整到其初始大小以下,那就太好了,但可能没有。

于 2013-07-02T14:51:58.700 回答