2016-07-22 2 views
0

4 개의 이미지 (3 개의 라인과 게이트 심볼)를 사용하여 OR 게이트를 만들어야합니다. 이렇게하려면 wxGridBagSizer에서 셀에 배치 된 이미지가 겹쳐 져야합니다. 어떻게하면 될까요?wxPython의 wxFormBuilder를 사용하여 wxGridBagSizer에서 wxStaticBitmap 이미지를 겹치는 방법

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() 
{ 
} 
+0

어떤 코드가 wxFB에 의해 생성 되었습니까? 당신은 비교할 수 있습니까? – Igor

+0

또한 호기심 때문에 왜 GridBagSizer를 사용하고 싶습니까? BoxSizer가 충분하지 않습니까? – Igor

+0

@Igor : wxFB에서 생성 된 코드를 편집하고 추가했습니다. GridBagSizer를 사용하면 행과 열의 요소를 설정하고 각 셀을 사용자 정의 할 수 있습니다. – SMD

답변

1

wxWidgets에 겹치는 형제 위젯을 지원하지 않습니다 (당신이 경우에 wx.StaticBitmaps) 그리고 당신이 그렇게 정의되지 수행하려고 할 때 발생하는 동작. 또한 sizer는 아이템을 중첩 할 수 있도록 설계되지 않았으므로 근본 목적의 IMO와 반대됩니다.

그러나 각 비트 맵을 사용하지 않고 비트 맵을 쉽게 그릴 수 있으며 필요에 따라 비트 맵을 겹치게 만들 수도 있습니다. 이렇게하려면 wx.Window 또는 wx.Panel을 기반으로 클래스에서 EVT_PAINT 메서드를 처리하고 그 페인트 핸들러에 비트 맵을 그리고 프레임에 해당 창의 인스턴스를 넣을 수 있습니다. 데모 및 다양한 자습서의 페인트 핸들러에서 많은 드로잉 예제가 있습니다.