我在traitsui应用程序中有一个用于蛋黄酱场景的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小部件时生成的大量sizers之后,我意识到这可能也很重要。
发布于 2013-07-02 22:51:59
经过几天的讨论,我得到了a)部分的答案(尽管它很复杂,不一定是通用的,而且可能是特定于layout='split'布局的)。
至少在layout='split'中,self.scene.scene_editor.control.Parent.Parent.Size描述了显示编辑器的视区的大小,但我可以很容易地想象到,对于其他布局类型(我没有测试过),它会有所不同。
有了这些信息,我设法编写了一个包装器,在制作快照之前将编辑器的大小调整为至少这么小。
更多血淋淋的细节:
与self.scene.scene_editor.control关联的sizer不是正确的,可能是因为该sizer引用了包含编辑器的窗口,而与包含拆分器小部件中的窗口大小关联的sizer被允许“覆盖”该窗口并忽略其大小。
我发现添加traitsui小部件的过程定义了太多的框(假设小部件的数量不是很少),结果导致wx窗口及其关联的wx Sizer大量过剩,所有这些都依赖于它们的子小部件来确定当前的大小,所以很难控制这样的事情。这可能就是enaml存在的原因;这样用户就可以显式地指定这些约束。也许有一天我会将我的程序转换为使用enaml,但对于目前运行得很好的程序来说,这似乎需要很大的努力。
我仍然不知道b)部分的答案,所以我把这个问题留待解决。如果有一种方法可以在构造时指定wx size的混乱,允许将此窗口的大小调整到其初始大小以下,那将是很好的,但可能没有一个。
https://stackoverflow.com/questions/17373612
复制相似问题