SetSizer,SetSizerAndFit和调整组件大小

时间:2011-06-09 14:45:43

标签: wxpython

所以我有一个wx.Frame,我添加了一个GLCanvas和一些按钮。以下是广告的部分:

self.sizer = wx.FlexGridSizer(2,2,20,20)
        self.xSize = FRAME_WIDTH - MIN_BUT_SIZE
        self.ySize = FRAME_HEIGHT - 40
        self.canvas = myGLCanvas(self, size=(self.xSize, self.ySize))
        self.panel = GLPanel(self, canvas=self.canvas)
        self.sizer.Add(self.canvas, 1, wx.EXPAND)
        self.sizer.Add(self.panel, 0, wx.EXPAND)
        self.headerSizer.DeleteWindows()
        self.centerSizer.Remove(self.headerSizer)
        self.Layout()
        self.centerSizer.Add(self.sizer)
        self.goBack = wx.Button(self, -1, str("Go Back!"))
        self.sizer.Add(self.goBack, 0, wx.ALIGN_CENTER_HORIZONTAL, 2)
        self.sizer.Add((20,20))
        self.SetSizerAndFit(self.mainGrid)
        self.Bind(wx.EVT_SIZING, self.OnSizing) 

我必须在这里提到self.centerSizer已经添加到self.mainGrid这一点以及我用于某些按钮的另一个sizer。现在,如果我使用self.SetSizer(mainGrid)而不是SetSizerAndFit(),我在上面的代码中添加的组件没有正确定位UNTIL我手动调整框架大小。使用SetSizerAndFit这是有效的。但现在我希望我的gl画布用我的画框调整大小。所以我的方法是:

def OnSizing(self, event):
    size = self.GetSize()       
    newCanvasXSize = size.GetWidth() - MIN_BUT_SIZE
    newCanvasYSize = size.GetHeight() - 40
    self.canvas.SetSize((newCanvasXSize, newCanvasYSize))
    self.Layout()

然而,这不起作用,我的画布保持与以前相同的大小。我在某处读过SetSizerAndFit也设置了min_size,这就是为什么调整大小不能用它。但是,即使我使用SetSizer保留它,并调整框架大小以使所有内容都正确定位,画布的大小调整也不起作用。删除和创建GLCanvas不是选项,因为加载顶点需要相当长的时间。

修改

使用SetSizer + Layout可以完成定位。但是,Canvas仍然没有正确调整大小。我在画布中将一个OnResize绑定到EVT_SIZE:

def OnResize(self, e):
    self.width, self.height = e.GetSize()
    self.SetSize((self.width, self.height))
    self.Layout()

我打印了self.width和self.height,看看会发生什么。显示如下:

875 674 ---(这些是正确的值,但紧随其后) 640 520 ---(这些是使用Canvas创建的默认值)

这些模式会为每次调整重复。

EDIT2

好的,上面的行为是因为我的程序的一部分仍然有一个SetSizerAndFit。如果我采用纯粹的SetSizer + Layout方法,那么就会发生这种情况。组件(我的GLCanvas和其他3个按钮)将添加到相应位置的框架中。然而: 1.框架没有调整到所需大小,因此我的按钮位于框架外的某个位置。 2.GLCanvas已定位,但它不会显示任何内容,直到我自己进行调整大小事件。

3.可能没有正确连接,但可以减小最小尺寸?我问,因为如果我在画布上的Resize处理程序中使用SetMinSize(),它只会在大小增加时调整大小。如果框架尺寸减小,则画布将保留旧的(较大的)最小尺寸。

EDIT3

在经过一些调整之后,我设法让我的画布用框架调整大小。但是现在我有另外一个问题,我有一个带有一个画布的flex grid sizer和三个看起来像这样的按钮:

http://postimage.org/image/1cyhqqcck/

现在我已经设法使用框架调整画布大小,但是在调整大小时画面,三角形和后退按钮保持在同一位置,画布只是覆盖它们。我调用了Layout()而没有任何明显的效果。

1 个答案:

答案 0 :(得分:2)

我记得,即使是Robin Dunn(wxPython的创建者)也不使用SetSizerAndFit。如果你稍微改变帧大小可以正确定位东西,那么你只需要调用框架的Layout()方法。也许你需要调用它来解决GLCanvas部分。回顾一下,跳过SetSizerAndFit并使用SetSizer。