Wxpython 设置器、设置器和调整大小组件
所以我有一个wx.Frame,我在其中添加了一个GLCanvas和一些按钮。以下是这些广告的部分:Wxpython 设置器、设置器和调整大小组件,wxpython,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.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)而不是setSizerAndIt(),则在手动调整框架大小之前,我在上述代码中添加的组件不会正确定位。使用SetSizerAndIt,此操作有效。但现在我希望我的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()
然而,这不起作用,我的画布和以前一样大。我在某个地方读到过,setSizerAndIt也会设置min_大小,这就是调整大小不起作用的原因。但是,即使我将其保留在SetSizer中,并调整框架大小以使所有内容都正确定位,画布的大小调整也不起作用。删除和创建GLCanvas在这里不是和选项,因为加载顶点需要相当长的时间
编辑
确定使用设置器+布局完成定位。但是画布仍然无法正确调整大小。我在画布中有一个绑定到EVT_大小的OnResize,它可以:
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---(这些是创建画布时使用的默认值)
这种模式在每次调整大小时都会重复
EDIT2
好的,上面的行为是因为我的程序的一部分中仍然有一个SetSizerAndIt。如果我采用纯设置器+布局的方法,就会出现这种情况。组件(my GLCanvas和3个其他按钮)将添加到相应位置的框架中。然而:
1.框架未调整到所需大小,因此我的按钮位于框架外的某个位置。
2.GLCanvas已定位,但在我自己执行调整大小事件之前,它不会显示任何内容
3.可能没有直接连接,但可以减小最小尺寸?我这样问是因为如果我在画布上的Resize处理程序中使用SetMinSize(),它只会在大小增加时调整大小。如果帧大小减小,画布将保留旧的(较大的)最小大小
EDIT3
好的,经过一些调整,我设法让我的画布调整与框架。但现在我有另一个问题,我有一个flex grid sizer,它有一个画布和三个按钮,看起来像这样:
现在,我已经设法使我的画布大小与框架,但点,三角形和返回按钮停留在相同的位置时,调整大小和画布只是掩盖了他们。我调用了Layout(),但没有任何外观效果。我记得,即使是Robin Dunn(wxPython的创建者)也不使用setSizerAndUnit。如果在稍微更改框架大小时可以正确定位这些内容,那么只需调用框架的Layout()方法。这可能也是您解决GLCanvas部分所需调用的全部内容。总而言之,跳过SetSizerAndIt,只使用SetSizer。谢谢,SetSizer+布局定位所有内容。但是,调整大小仍然不起作用。忽略最后的注释。SetSizer+布局仍然无法正常工作。听起来像是个奇怪的问题。我没有用过GLCanvas,所以我不知所措。如果有机会,可以尝试交叉投递到wxPython邮件列表。我相信那里有人能给你一些指导。凯,是他做的。但是我现在有一个不同的问题。在我的原始文章中添加了一些编辑内容,并提供了相关信息。在wxPython邮件列表的帮助下,使其正常工作。AddGrowtableRow()和AddGrowtableColumn的组合,以及一些严格的布局调用,可以正常工作。