wxpython布局(带尺寸器)

wxpython布局(带尺寸器),python,layout,wxpython,sizer,Python,Layout,Wxpython,Sizer,我在wxpython很难让我的测码器正常工作。我试着在顶部做一个简单的水平条(里面有文本),在下面做两个垂直框(用gridsizers*左边应该只有两列!!*在每个框里面)。我希望图像中的所有内容都能拉伸并适合我的面板(能够在侧面和顶部/底部添加填充物) 我有两个主要问题: 1.我不能把横栏上的文字放在中间(向左) 2.我想空间的两个垂直框跨度和适合的页面(也希望网格跨度更好) 这是我的代码(省略了一些部分): 这就是你想要的吗 import wx class Frame(wx.Frame):

我在wxpython很难让我的测码器正常工作。我试着在顶部做一个简单的水平条(里面有文本),在下面做两个垂直框(用gridsizers*左边应该只有两列!!*在每个框里面)。我希望图像中的所有内容都能拉伸并适合我的面板(能够在侧面和顶部/底部添加填充物)

我有两个主要问题: 1.我不能把横栏上的文字放在中间(向左) 2.我想空间的两个垂直框跨度和适合的页面(也希望网格跨度更好)

这是我的代码(省略了一些部分):


这就是你想要的吗

import wx

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.panel = wx.Panel(self)

        main_sizer = wx.BoxSizer(wx.VERTICAL)

        # Title
        self.centred_text = wx.StaticText(self.panel, label="Title")
        main_sizer.Add(self.centred_text, 0, wx.ALIGN_CENTRE | wx.ALL, 3)

        # Grids
        content_sizer = wx.BoxSizer(wx.HORIZONTAL)
        grid_1 = wx.GridSizer(12, 2, 0, 0)
        grid_1.AddMany(wx.StaticText(self.panel, label=str(i)) for i in xrange(24))
        content_sizer.Add(grid_1, 1, wx.EXPAND | wx.ALL, 3)
        grid_2 = wx.GridSizer(10, 3, 0, 0)
        grid_2.AddMany(wx.StaticText(self.panel, label=str(i)) for i in xrange(30))
        content_sizer.Add(grid_2, 1, wx.EXPAND | wx.ALL, 3)

        main_sizer.Add(content_sizer, 1, wx.EXPAND)

        self.panel.SetSizer(main_sizer)

        self.Show()


if __name__ == "__main__":

    app = wx.App(False)
    Frame(None)
    app.MainLoop()

像这样的东西

import wx



class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,-1,"Test Stretching!!")
        p1 = wx.Panel(self,-1,size=(500,100))
        p1.SetMinSize((500,100))
        p1.SetBackgroundColour(wx.GREEN)

        hsz = wx.BoxSizer(wx.HORIZONTAL)

        p2 = wx.Panel(self,-1,size=(200,400))
        p2.SetMinSize((200,400))
        p2.SetBackgroundColour(wx.RED)

        p3 = wx.Panel(self,-1,size=(300,400))
        p3.SetMinSize((300,400))
        p3.SetBackgroundColour(wx.BLUE)

        hsz.Add(p2,1,wx.EXPAND)
        hsz.Add(p3,1,wx.EXPAND)
        sz = wx.BoxSizer(wx.VERTICAL)
        sz.Add(p1,0,wx.EXPAND)
        sz.Add(hsz,1,wx.EXPAND)
        self.SetSizer(sz)
        self.Layout()
        self.Fit()

a = wx.App(redirect=False)
f = MyFrame()
f.Show()
a.MainLoop()

这里有一种方法:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        hSizer = wx.BoxSizer(wx.HORIZONTAL)
        leftGridSizer = wx.GridSizer(rows=10, cols=12, vgap=5, hgap=5)
        rightGridSizer = wx.GridSizer(rows=10, cols=3, vgap=5, hgap=5)


        title = wx.StaticText(self, label="Main title")

        mainSizer.Add(wx.StaticText(self), 0, wx.EXPAND)  # add a "spacer"
        mainSizer.Add(title, 0, wx.CENTER, wx.ALL, 10)

        for row in range(1, 11):
            for col in range(1, 13):
                lbl = "Row%s Col%s" % (row, col)
                leftGridSizer.Add(wx.StaticText(self, label=lbl))
        hSizer.Add(leftGridSizer, 0, wx.ALL, 20)

        for row in range(1, 11):
            for col in range(1, 4):
                lbl = "Row%s Col%s" % (row, col)
                rightGridSizer.Add(wx.StaticText(self, label=lbl))

        hSizer.Add(rightGridSizer, 0, wx.ALL, 20)
        mainSizer.Add(hSizer)

        self.SetSizer(mainSizer)

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Sizers", size=(1600,600))
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

要了解跨行,我建议看一下wxPython演示。我认为这可能只在wx.GridBagSizer和FlexGridSizer中得到支持。不过,您可以尝试使用span参数。另外,应该注意wx.GROW和wx.EXPAND是一个相同的概念。您可能还想查看wiki以了解更多信息:

您能提供一个可运行的示例吗?顺便说一句,您只需要2个框大小器和2个网格大小器。(水平框尺寸器中的网格尺寸器,垂直尺寸器中的文本和水平尺寸器)。在添加gridsizers时,您可能也希望将比例设置为1。GP89和Mike都做到了这一点。谢谢你的帮助!仅供参考,我很确定wx.GROW和wx.Expander是一样的我想你是对的。。。出于某种原因,我认为增长是垂直增长,而扩张是水平的……可悲的是,如果你真的想让某个东西居中,你必须把它放在一个水平的尺寸仪中,然后把它放在一个垂直的尺寸仪中。
import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        hSizer = wx.BoxSizer(wx.HORIZONTAL)
        leftGridSizer = wx.GridSizer(rows=10, cols=12, vgap=5, hgap=5)
        rightGridSizer = wx.GridSizer(rows=10, cols=3, vgap=5, hgap=5)


        title = wx.StaticText(self, label="Main title")

        mainSizer.Add(wx.StaticText(self), 0, wx.EXPAND)  # add a "spacer"
        mainSizer.Add(title, 0, wx.CENTER, wx.ALL, 10)

        for row in range(1, 11):
            for col in range(1, 13):
                lbl = "Row%s Col%s" % (row, col)
                leftGridSizer.Add(wx.StaticText(self, label=lbl))
        hSizer.Add(leftGridSizer, 0, wx.ALL, 20)

        for row in range(1, 11):
            for col in range(1, 4):
                lbl = "Row%s Col%s" % (row, col)
                rightGridSizer.Add(wx.StaticText(self, label=lbl))

        hSizer.Add(rightGridSizer, 0, wx.ALL, 20)
        mainSizer.Add(hSizer)

        self.SetSizer(mainSizer)

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Sizers", size=(1600,600))
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()