【问题标题】:wxpython layout with sizers带有sizer的wxpython布局
【发布时间】:2013-08-01 14:05:32
【问题描述】:

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

我有两个主要问题: 1.我不能让水平栏中的文字在中间(它向左) 2. 我想将两个垂直框隔开以跨越并适当地适应页面(也希望网格也能更好地跨越)。

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

            self.LeagueInfoU = wx.Panel(self.LeagueInfo,-1, style=wx.BORDER_NONE)
            self.LeagueInfoL = wx.Panel(self.LeagueInfo,-1, style=wx.BORDER_NONE)
            self.LeagueInfoR = wx.Panel(self.LeagueInfo,-1, style=wx.BORDER_NONE)

            vbox  = wx.BoxSizer(wx.VERTICAL)

            hbox1 = wx.BoxSizer(wx.HORIZONTAL)
            hbox2 = wx.BoxSizer(wx.HORIZONTAL)

            vbox2a = wx.GridSizer(12,2,0,0)
            vbox3a = wx.GridSizer(10,3,0,0)
            hbox1a = wx.BoxSizer(wx.VERTICAL)

            vbox2 = wx.BoxSizer(wx.VERTICAL)
            vbox3 = wx.BoxSizer(wx.VERTICAL)


            hbox1.Add(self.LeagueInfoU, 1, wx.EXPAND | wx.ALL, 3)
            vbox2.Add(self.LeagueInfoL, 1, wx.EXPAND | wx.ALL, 3)
            vbox3.Add(self.LeagueInfoR, 1, wx.EXPAND | wx.ALL, 3)

            vbox2a.AddMany([this is all correct])
            self.LeagueInfoL.SetSizer(vbox2a)

            vbox3a.AddMany([this is all correct])  
            self.LeagueInfoR.SetSizer(vbox3a)

            font = wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.BOLD)
            self.Big_Header = wx.StaticText(self.LeagueInfoU, -1, 'Testing This')
            self.Big_Header.SetFont(font)

            hbox1a.Add(self.Big_Header, 0, wx.ALIGN_CENTER|wx.ALIGN_CENTER_VERTICAL)        
            self.LeagueInfoU.SetSizer(hbox1a)

            hbox2.Add(vbox2, 0, wx.EXPAND)
            hbox2.Add(vbox3, 0, wx.EXPAND)

            vbox.Add(hbox1, 0, wx.EXPAND)
            vbox.Add(hbox2, 1, wx.EXPAND)
            self.LeagueInfo.SetSizer(vbox)

【问题讨论】:

  • 你能举一个可运行的例子吗?
  • 顺便说一句,您只需要 2 个 box sizer 和 2 个 grid sizer。 (水平框尺寸器中的网格尺寸器,然后是垂直尺寸器中的文本和水平尺寸器)。在添加 gridsizer 时,您可能也希望将比例设置为 1。
  • GP89 ​​和 Mike 都成功了。感谢您的帮助!

标签: python layout wxpython sizer


【解决方案1】:

这是一种方法:

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 以获取更多信息:http://wiki.wxpython.org/GridBagSizerTutorial

【讨论】:

    【解决方案2】:

    这样的??

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

    【讨论】:

    • 仅供参考,我很确定 wx.GROW 与 wx.EXPAND 相同
    • 是的,我猜你是对的......出于某种原因,我认为增长是垂直增长,而扩展是水平......
    • 遗憾的是,如果你想真正、真正地居中,你必须把它放在一个水平尺寸器里面,然后把它放在一个垂直尺寸器里面。
    【解决方案3】:

    这就是你所追求的吗?

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

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 2011-03-16
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多