我的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之后,我意识到这可能很重要好。
答案 0 :(得分:0)
在黑客攻击几天之后,我得到了答案a))(虽然它是hacky,不一定是通用的,它可能是layout='split'
布局特有的。)
self.scene.scene_editor.control.Parent.Parent.Size
描述了显示编辑器的视口的大小,至少用layout='split'
,但我可以很容易地想象它对于其他布局类型会有所不同(我没有检验)。
有了这些信息,我设法编写了一个包装器,在编辑快照之前将编辑器调整为至少这么小。
更多血腥的细节:
与self.scene.scene_editor.control
关联的sizer不是正确的,可能是因为sizer指的是包含编辑器的窗口,而与包含拆分器窗口小部件中的窗口大小相关联的sizer允许“覆盖” “那个窗口,忽略它的大小。
我发现添加traitsui小部件的过程定义了这么多的框(假设有一些非常小的小部件),导致wx Windows及其相关的wx Sizer大量过剩,这些都依赖于他们的子小部件来确定目前的规模,所以控制这样的事情是非常困难的。这可能就是enaml存在的原因;这样可以由用户明确指定这些约束。也许总有一天我会将我的程序转换为使用enaml,但这对于目前运行良好的东西来说似乎需要付出很多努力。
我仍然没有对b)部分的答案,所以我将这个问题保持开放。如果有一种方法可以在构造中指定wx sizer的混乱,那么允许将此窗口大小调整到其初始大小以下,但可能没有。