Мне нужно создать OR Gate, используя 4 изображения (3 строки и символ Gate). Это требует перекрытия изображений, помещенных в ячейки в wxGridBagSizer. Как я могу это достичь?Как совместить изображения wxStaticBitmap в wxGridBagSizer с помощью wxFormBuilder в wxPython
Я пытаюсь установить отрицательную vgap и hgap используя wxFormBuilder перекрываться изображения, но 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()
И это сработало. Я мог бы получить следующий вывод:
Пожалуйста, помогите мне достичь этого с помощью 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()
{
}
какой код был создан wxFB? Вы можете сравнить? – Igor
также из любопытства, почему вы хотите использовать GridBagSizer? Неужели BoxSizer недостаточно? – Igor
@Igor: Я отредактировал и добавил код, созданный wxFB. И GridBagSizer позволяет мне устанавливать элементы в строках и столбцах и настраивать каждую ячейку. – SMD