如何在 wxPython 中使用 wxFormBuilder 在 wxGridBagSizer 中重叠 wxStaticBitmap 图像

How to overlap wxStaticBitmap images in wxGridBagSizer using wxFormBuilder in wxPython

我需要使用 4 个图像(3 条线和门符号)创建一个或门。这需要重叠放置在 wxGridBagSizer 中的单元格中的图像。我怎样才能做到这一点?

Attempt using wxFormBuilder

我正在尝试使用 wxFormBuilder 设置负的 vgap 和 hgap 来重叠图像,但 wxFormBuilder 不接受负值。

然后我尝试编写原始代码来实现相同的目的:

 self.widgetSizer = wx.GridBagSizer(hgap=-6,vgap=-20)


 self.orGateImage = wx.StaticBitmap(self, -1, self.orGateImageBitmap, style=wx.BITMAP_TYPE_PNG) 
 self.LineImageOffA = wx.StaticBitmap(self, -1, self.LineImageOffBitmap, style=wx.BITMAP_TYPE_PNG)
 self.LineImageOffB = wx.StaticBitmap(self, -1, self.LineImageOffBitmap, style=wx.BITMAP_TYPE_PNG)
 self.LineImageOffX = wx.StaticBitmap(self, -1, self.LineImageOffBitmap, style=wx.BITMAP_TYPE_PNG)


 self.LetterAImage = wx.StaticBitmap(self, -1, self.LetterAImageBitmap, style=wx.BITMAP_TYPE_PNG)
 self.LetterBImage = wx.StaticBitmap(self, -1, self.LetterBImageBitmap, style=wx.BITMAP_TYPE_PNG)
 self.LetterXImage = wx.StaticBitmap(self, -1, self.LetterXImageBitmap, style=wx.BITMAP_TYPE_PNG)


 self.widgetSizer.Add(self.LineImageOffA, pos=(0,1), border=10) 
 self.widgetSizer.Add(self.LineImageOffB, pos=(2,1), border=2)
 self.widgetSizer.Add(self.LineImageOffX, pos=(1,3), flag=wx.ALIGN_CENTER,border=2)
 self.widgetSizer.Add(self.orGateImage, pos=(1,2), border=10)
 self.widgetSizer.Add(self.LetterAImage, pos=(0,0), border=10)
 self.widgetSizer.Add(self.LetterBImage, pos=(2,0), border=10)
 self.widgetSizer.Add(self.LetterXImage, pos=(1,4), flag=wx.ALIGN_CENTER, border=10)

 self.frame.fSizer.Layout()

它奏效了。我可以获得以下输出:

Attempt using raw code

请帮助我使用 wxFormBuilder 实现此目的,因为我需要在我的项目中快速创建此类元素。有没有其他方法可以完成此操作?

wxFormBuilder生成的代码如下:

MyFrame1::MyFrame1( wxWindow* parent, wxWindowID id, const wxString&     title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    wxBoxSizer* bSizer1;
    bSizer1 = new wxBoxSizer( wxVERTICAL );

    wxGridBagSizer* gbSizer1;
    gbSizer1 = new wxGridBagSizer( 0, 0 );
    gbSizer1->SetFlexibleDirection( wxBOTH );
    gbSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );

    m_bitmap1 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( wxT("../../home/ece/Desktop/scripts/fromPI/GREEN_LINE_OFF_SMALL.png"), wxBITMAP_TYPE_ANY ), wxDefaultPosition, wxSize( 85,5 ), 0 );
    gbSizer1->Add( m_bitmap1, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 );

    m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( wxT("../../home/ece/Desktop/scripts/fromPI/GREEN_LINE_OFF_SMALL.png"), wxBITMAP_TYPE_ANY ), wxDefaultPosition, wxSize( 85,5 ), 0 );
    gbSizer1->Add( m_bitmap2, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 );

    m_bitmap3 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( wxT("../../home/ece/Desktop/scripts/fromPI/OR_GATE_SMALL.png"), wxBITMAP_TYPE_ANY ), wxDefaultPosition, wxDefaultSize, 0 );
    gbSizer1->Add( m_bitmap3, wxGBPosition( 1, 2 ), wxGBSpan( 1, 1 ), wxALL, 5 );

   m_bitmap4 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( wxT("../../home/ece/Desktop/scripts/fromPI/GREEN_LINE_OFF_SMALL.png"), wxBITMAP_TYPE_ANY ), wxDefaultPosition, wxSize( 85,5 ), 0 );
   gbSizer1->Add( m_bitmap4, wxGBPosition( 1, 3 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER|wxALL, 5 );

   bSizer1->Add( gbSizer1, 1, wxEXPAND, 5 );

   this->SetSizer( bSizer1 );
   this->Layout();
}

MyFrame1::~MyFrame1()
{
}

wxWidgets 不支持重叠的兄弟小部件(在这种情况下是您的 wx.StaticBitmaps),并且当您尝试这样做时发生的行为是未定义的。此外,sizer 并非设计为能够重叠项目,这违背了 IMO 的基本目的。

但是,您可以轻松地自己绘制位图,而无需为每个位图使用小部件,并根据需要让它们尽可能多地重叠或尽可能少地重叠。为此,您可以在基于 wx.Windowwx.Panel 的 class 中处理 EVT_PAINT 方法,并在该绘制处理程序中绘制位图,然后放置该 window 在你的框架中。在演示和各种教程中有很多在绘画处理程序中绘制的示例。