所以我有一个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()而没有任何明显的效果。
答案 0 :(得分:2)
我记得,即使是Robin Dunn(wxPython的创建者)也不使用SetSizerAndFit。如果你稍微改变帧大小可以正确定位东西,那么你只需要调用框架的Layout()方法。也许你需要调用它来解决GLCanvas部分。回顾一下,跳过SetSizerAndFit并使用SetSizer。