2

我正在使用 wx.BoxSizers 来对齐我的(这里是简化的)程序的元素。我需要蓝色面板 1 的形状为 4:3 的纵横比,但要扩展以填充框架,为此我给它的比例=1。但是我希望文本直接位于 panel1 下方,但尽可能小(portion=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()
4

2 回答 2

1

由于面板的形状不同,您无法准确地得到它。当您将框架设置得太小时,会导致面板从文本中缩小。不过,您可以使用其 SetSizeHints 方法设置 Frame 的最小尺寸,这样可以防止该问题。接下来,您应该在文本后添加一个分隔符,以帮助使其与面板保持一致。我只是使用了一个简单的 tuple hack。这是略有不同的代码:

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 类,因为无论如何您都称它为面板。我还在框架上放置了一个面板,因为它可以帮助改善应用程序跨平台的外观(并且它可以在小部件之间进行选项卡)。

于 2013-01-16T16:07:21.687 回答
1

在将项目添加到 sizer 时,您可能还想尝试使用 wx.SHAPED 标志。它旨在使 sizer 保持项目的纵横比,尽管我自己使用它已经很长时间了,以至于我不知道它是否仍然可以正常工作。;-)

于 2013-01-16T19:09:01.007 回答