Wxpython 设置器、设置器和调整大小组件

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))

所以我有一个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)而不是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的组合,以及一些严格的布局调用,可以正常工作。