Python wx.BoxSizer项目未正确对齐

Python wx.BoxSizer项目未正确对齐,python,wxpython,Python,Wxpython,我正在使用wx.boxsizer来对齐我(这里是简化的)程序的元素。我需要蓝色镶板1的形状为4:3的纵横比,但需要扩展以填充框架,为此,我将其比例设为1。但是,我希望文本位于panel1的正下方,但尽可能小(PorParty=0) 但是,当我设置此选项时,panel1向下展开(即使假定它是成型的),文本被推到窗口底部。我希望文本“拥抱”panel1,即使窗口已调整大小。我该如何解决这个问题?谢谢 import wx class myWindow(wx.Window): def __in

我正在使用wx.boxsizer来对齐我(这里是简化的)程序的元素。我需要蓝色镶板1的形状为4:3的纵横比,但需要扩展以填充框架,为此,我将其比例设为1。但是,我希望文本位于panel1的正下方,但尽可能小(PorParty=0)

但是,当我设置此选项时,panel1向下展开(即使假定它是成型的),文本被推到窗口底部。我希望文本“拥抱”panel1,即使窗口已调整大小。我该如何解决这个问题?谢谢

import wx

class myWindow(wx.Window):
    def __init__(self, parent, size):
        wx.Window.__init__(self, parent=parent, size=size)
        self.SetBackgroundColour(wx.BLUE)

class MainWindow(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent, size=(500,500) )

        self.panel1 = myWindow(self, size=(400,300))
        self.text = wx.StaticText(self, label="This is text.")

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.mainSizer.Add(self.panel1, 1, wx.ALIGN_TOP | 
                           wx.SHAPED | wx.EXPAND | wx.ALL, border=10)
        self.mainSizer.Add(self.text, 0, wx.EXPAND | 
                           wx.ALIGN_TOP | wx.LEFT, border=10)
        self.SetSizer(self.mainSizer)
        self.Show()

app = wx.App(False)
panel = MainWindow(None)
app.MainLoop()

你不能完全得到它,因为你的面板的形状。如果将框架设置得太小,则会导致面板收缩,远离文本。不过,您可以使用其SetSizeHints方法设置帧的最小大小,这将防止出现该问题。接下来,您应该在文本后添加一个间隔符,以帮助它紧靠面板。我只是用了一个简单的元组破解。以下是略有不同的代码:

import wx

class myWindow(wx.Panel):
    def __init__(self, parent, size):
        wx.Panel.__init__(self, parent=parent, size=size)
        self.SetBackgroundColour(wx.BLUE)

class MainWindow(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent, size=(500,500) )

        topPanel = wx.Panel(self)
        self.panel1 = myWindow(topPanel, size=(400,300))
        self.text = wx.StaticText(topPanel, label="This is text.")

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.mainSizer.Add(self.panel1, 8, wx.ALIGN_TOP | 
                           wx.SHAPED | wx.EXPAND | wx.ALL, border=10)
        self.mainSizer.Add(self.text, 0,  
                           wx.ALIGN_TOP | wx.LEFT | wx.BOTTOM, 10)
        self.mainSizer.Add((1,1), 1, wx.EXPAND)
        topPanel.SetSizer(self.mainSizer)
        self.SetSizeHints(500, 500, 3500, 3500)
        self.Show()

app = wx.App(False)
panel = MainWindow(None)
app.MainLoop()

请注意,我将您的wx.Window类替换为wx.Panel类,因为您仍然将其称为Panel。我还在框架上放了一个面板,这有助于应用程序跨平台的外观和感觉(并且它可以在小部件之间进行选项卡切换)。

在将项目添加到sizer时,您可能还想尝试使用wx.SHAPED标志。它的目的是使施胶器保持物品的纵横比,尽管我自己已经很久没有使用它了,我不知道它是否还能正常工作。;-)

演示中的LayoutAnchor可能会很有用。。。。(可能也不…)这是一个令人沮丧的是,它不是真的可行,但这是一个进步。理想情况下,即使在极端的窗口大小下,底部的空间也会消失,但是它在中间工作。您知道(可能使用LayoutAnchor)将面板“连接”到彼此的任何方法吗?谢谢