wxpython:角落里的小方形面板
wxpython: small square panel in corner
我正在尝试在另一个面板 (panel1) 的右下角放置一个小方形面板 (panel2)。
面板 1 应填满整个框架并随着框架的大小调整而扩展,但方形面板 (面板 2) 应保持不变,不会扩展或调整大小。
像这样:
我想我遗漏了一件小事,但我不知道如何实现。方形面板与面板 1 一起展开,我不希望这种情况发生。
这是我的简化代码:
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()
试试这个代码:
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()
这实际上是相当微不足道的。您只需使用两个 BoxSizers 即可获得您想要的效果。请看下面的代码:
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()
如果您 运行 这段代码,您应该会看到类似这样的内容:
我正在尝试在另一个面板 (panel1) 的右下角放置一个小方形面板 (panel2)。
面板 1 应填满整个框架并随着框架的大小调整而扩展,但方形面板 (面板 2) 应保持不变,不会扩展或调整大小。
像这样:
我想我遗漏了一件小事,但我不知道如何实现。方形面板与面板 1 一起展开,我不希望这种情况发生。
这是我的简化代码:
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()
试试这个代码:
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()
这实际上是相当微不足道的。您只需使用两个 BoxSizers 即可获得您想要的效果。请看下面的代码:
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()
如果您 运行 这段代码,您应该会看到类似这样的内容: