【问题标题】:wxpython: small square panel in cornerwxpython:角落里的小方形面板
【发布时间】:2015-07-08 18:01:32
【问题描述】:

我试图在另一个面板(panel1) 的右下角放置一个小方形面板(panel2)。

面板 1 应填满整个框架并随着框架的大小调整而展开,但方形面板 (panel2) 应保持不变。

类似这样的:

我认为我错过了一件小事,但我就是不知道如何实现这一点。方形面板与 panel1 一起扩展,我不希望这种情况发生。

这是我的简化代码:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title,size=(250, 250))

        #topPanel = wx.Panel(self)

        panel1 = wx.Panel(self, -1)
        panel2 = wx.Panel(panel1, -1, size = (100,100))
        panel2.SetBackgroundColour('gray')
        s = wx.BoxSizer(wx.VERTICAL)
        s.Add(panel2,1, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
        panel1.SetSizer(s)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel1,1,flag = wx.EXPAND)
        self.SetSizer(sizer)

class MyApp(wx.App):
     def OnInit(self):
         frame = MyFrame(None, -1, 'frame')
         frame.Show(True)
         return True

app = MyApp(0)
app.MainLoop()

【问题讨论】:

    标签: python wxpython wxwidgets


    【解决方案1】:

    试试这个代码:

    import wx
    class MyFrame(wx.Frame):
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title,size=(250, 250))
            panel1 = wx.Panel(self, -1)
            panel1.SetTransparent(100)
            panel2 = wx.Panel(panel1, -1,pos=(200,180), size = (40,40))
            panel2.SetBackgroundColour('gray')
            s = wx.BoxSizer(wx.HORIZONTAL)
            s.Add(panel1,1, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
            panel1.SetSizer(s)
            sizer = wx.BoxSizer(wx.HORIZONTAL)
            sizer.Add(panel2,1,wx.EXPAND)
            panel2.SetSizer(sizer)
    
    class MyApp(wx.App):
        def OnInit(self):
            frame = MyFrame(None, -1, 'frame')
            frame.Show(True)
            return True
    
    app = MyApp(0)
    app.MainLoop()
    

    【讨论】:

    • wx.BoxSizer() 应该是 wx.HORIZONTAL 并给出 panel2 的位置
    • 谢谢,但提供绝对位置不会使 panel2 在调整大小时移动到角落。有什么办法也可以实现吗?此外,代码在调整框架大小时崩溃
    • 为避免代码崩溃,将“panel1.SetSizer(s)”替换为“self.SetSizer(s)”。
    • 是的,没关系。但我想知道是否可以在调整大小的同时保留布局?
    【解决方案2】:

    这实际上是微不足道的。您只需要使用两个 BoxSizer 即可获得您想要的效果。请看下面的代码:

    import wx
    
    ########################################################################
    class SmallPanel(wx.Panel):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent, size=(50,50))
            self.SetBackgroundColour("red")
    
    
    ########################################################################
    class MainPanel(wx.Panel):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self, parent):
            """Constructor"""
            wx.Panel.__init__(self, parent)
    
            top_sizer = wx.BoxSizer(wx.VERTICAL)
            h_sizer = wx.BoxSizer(wx.HORIZONTAL)
    
            top_sizer.AddStretchSpacer(prop=1)
    
            mini_panel = SmallPanel(self)
    
            h_sizer.AddStretchSpacer(prop=1)
            h_sizer.Add(mini_panel, 0, wx.ALL, 5)
            top_sizer.Add(h_sizer, 0, wx.EXPAND)
            self.SetSizer(top_sizer)
    
    
    ########################################################################
    class MainFrame(wx.Frame):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self):
            """Constructor"""
            wx.Frame.__init__(self, None, title="Panels")
            panel = MainPanel(self)
            self.Show()
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MainFrame()
        app.MainLoop()
    

    如果您运行此代码,您应该会看到如下内容:

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 2015-03-08
      • 2021-11-10
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2013-10-18
      • 2013-08-25
      相关资源
      最近更新 更多