【问题标题】:wxpython nesting panels and sizerswxpython嵌套面板和sizer
【发布时间】:2015-03-19 09:18:27
【问题描述】:

我对 wxPython 比较陌生,正在尝试构建一个 GUI。想法如下:我想将列彼此相邻。左列的宽度为总宽度的 1/3,并包含垂直堆叠的按钮列表。右列有剩余的 2/3 宽度,并包含两个垂直堆叠的静态文本。

我尝试创建一个带有水平 boxsizer 的主面板,其中包含两个带有垂直 boxsizer 的面板。不过,所有按钮(可能还有文本)似乎都堆叠在同一个地方。

我的代码:

wx.Frame.__init__(self, None, wx.ID_ANY, "Load coordinates", size=(600,600))
mainPanel = wx.Panel(self, wx.ID_ANY, size=(600,600))
btnPanel = wx.Panel(self, wx.ID_ANY, size=(600,300))
txtPanel = wx.Panel(self, wx.ID_ANY, size=(600,300))

# create the buttons and bindings
btn1 = wx.Button(btnPanel, 1, label="1")
btn2 = wx.Button(btnPanel, 2, label="2")
btn3 = wx.Button(btnPanel, 3, label="3")
btn4 = wx.Button(btnPanel, 4, label="4")
btn5 = wx.Button(btnPanel, 5, label="5")

# create static text field
text1 = wx.StaticText(txtPanel, 6) 

# put the buttons in a sizer
btnSizer = wx.BoxSizer(wx.VERTICAL)
btnSizer.Add(btn1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn2, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn3, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn4, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)

# create line for visual
btnLine = wx.StaticLine(self)
btnSizer.Add(btnLine, 1, wx.ALL|wx.LEFT|wx.EXPAND, 20)

# last button
btnSizer.Add(btn5, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)

# put text in a sizer
txtSizer = wx.BoxSizer(wx.VERTICAL)
txtSizer.Add(text1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)

btnPanel.SetSizer(btnSizer)
txtPanel.SetSizer(txtSizer)

# add panels to main panel
mainSizer = wx.BoxSizer(wx.HORIZONTAL)
mainSizer.Add(btnPanel, 1, wx.EXPAND, 5)
mainSizer.Add(txtPanel, 1, wx.EXPAND, 5)
mainPanel.SetSizer(mainSizer)

任何人都可以看到为什么这没有按预期工作吗?

【问题讨论】:

    标签: python-2.7 wxpython


    【解决方案1】:

    实际上,您几乎总是将面板设为小部件的父级。这不仅可以在所有平台上提供正确的外观,而且还可以在小部件之间正确地进行选项卡。此外,您不应该使用自己的 ID,尤其是那些太低的 ID。这些 id 可能是 wxPython 自己保留的,可能会导致一些非常奇怪的行为。

    下面是一个例子,展示了如何做你想做的事(或接近它):

    import wx
    
    ########################################################################
    class MyPanel(wx.Panel):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent)
    
            main_sizer = wx.BoxSizer(wx.HORIZONTAL)
            btn_sizer = wx.BoxSizer(wx.VERTICAL)
            txt_sizer = wx.BoxSizer(wx.VERTICAL)
    
            for i in range(5):
                btn = wx.Button(self, label='%s' % i)
                btn_sizer.Add(btn, 0, wx.ALL|wx.LEFT)
    
            txt = wx.TextCtrl(self, style=wx.TE_MULTILINE)
            txt_sizer.Add(txt, 1, wx.EXPAND)
    
            main_sizer.Add(btn_sizer, 1)
            main_sizer.Add(txt_sizer, 2, wx.EXPAND)
    
            self.SetSizer(main_sizer)
    
    
    ########################################################################
    class MainFrame(wx.Frame):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self):
            """Constructor"""
            wx.Frame.__init__(self, None, title='Nesting Panels')
            panel = MyPanel(self)
            self.Show()
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MainFrame()
        app.MainLoop()
    

    【讨论】:

      【解决方案2】:

      解决了这个问题。我不需要制作多个面板(尽管我不知道这是否会有所不同),最重要的是我需要将 sizer 设置为 Frame 而不是面板,因此:

      # faulty:
      mainPanel.SetSizer(mainSizer)
      
      # correct
      self.SetSizer(mainSizer)
      

      【讨论】:

        猜你喜欢
        • 2012-12-10
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2013-10-07
        • 2011-07-06
        • 1970-01-01
        相关资源
        最近更新 更多