Я не нашел решения для этого, поэтому я так и сделал.
Сначала я создал собственный класс wx.Panel, подобный этому
class MyCustomPanel(wx.Panel):
def __init__(self, Parent):
wx.Panel.__init__(self, Parent, -1)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
def OnSize(self, event):
self.Refresh()
event.Skip()
def OnPaint(self, event):
dc = wx.PaintDC(self)
dc.SetPen(wx.Pen("Gray", width=1))
dc.SetBrush(wx.Brush("black", wx.TRANSPARENT))
mySize = self.GetSize()
dc.DrawRectangle(0,0, mySize.GetWidth(), mySize.GetHeight())
Этот класс можетиспользоваться как обычная панель, но имеет вокруг себя рамку.Это основная программа:
import wx
import wx.lib.stattext as ST
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title=title, size=(900, 750))
self.SetBackgroundColour('Black')
self.SetForegroundColour("White")
PanelMain = wx.Panel(self, -1)
PanelMain.SetForegroundColour("White")
PanelMain.SetBackgroundColour("Black")
SizerMain = wx.BoxSizer(wx.HORIZONTAL)
for i in range(3):
PanelSub = MyCustomPanel(PanelMain)
PanelSub.SetBackgroundColour("Black")
lblNew = ST.GenStaticText(PanelSub, -1, label="Hello {}".format(i))
lblNew.SetForegroundColour("White")
lblNew.SetBackgroundColour("Green" if i == 0 else "Blue")
SizerMain.Add(PanelSub, 1, wx.EXPAND|wx.ALL, 5)
PanelMain.SetSizer(SizerMain)
SizerMain.Fit(PanelMain)
self.Show()
app = wx.App()
Example(None, title='Boxes')
app.MainLoop()
Примечание: Заменено wx.StaticText
на ST.GenStaticText
, так как это работает лучшена GTK
Примечание 2: К сожалению, в этом простом примере граница перекрывается текстовым полем (см. этот рисунок ниже).Это не так в моем реальном коде, так как я использую там внутренний классификатор.В простом примере этого можно избежать, добавив внутренний классификатор, содержащий текстовые метки.
![Textbox overlaps the border of the panel](https://i.stack.imgur.com/9ZyrQ.png)