2016-07-22 6 views
0

Ich muss ein OR-Gate erstellen, indem Sie 4 Bilder (3 Zeilen und Gate-Symbol) verwenden. Dies erfordert eine Überlappung von Bildern, die in Zellen in wxGridBagSizer platziert sind. Wie kann ich das erreichen?Wie wxStaticBitmap-Bilder in wxGridBagSizer mit WxFormBuilder in WxPython überlappen

Attempt using wxFormBuilder

Ich versuche negative VGAP und HGAP einzustellen wxFormBuilder unter Verwendung der Bilder überlappen, aber wxFormBuilder wird negative Werte nicht akzeptieren.

Dann habe ich versucht, roh, Code zu schreiben, das gleiche zu erreichen:

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() 

Und es funktionierte. Ich konnte die folgende Ausgabe:

Attempt using raw code

Bitte helfen Sie mir, dies mit wxFormBuilder zu erreichen, wie ich solche Elemente schnell in meinem Projekt erstellen müssen. Gibt es eine andere Alternative, um dies zu erreichen?

Der Code von wxFormBuilder erzeugt wird, wie folgt:

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

Welcher Code wurde von wxFB generiert? Kannst du vergleichen? – Igor

+0

auch aus Neugier, warum möchten Sie GridBagSizer verwenden? Ist BoxSizer nicht genug? – Igor

+0

@Igor: Ich habe den von wxFB generierten Code bearbeitet und hinzugefügt. Und mit GridBagSizer kann ich die Elemente in Zeilen und Spalten setzen und jede Zelle anpassen. – SMD

Antwort

1

wxWidgets unterstützt nicht überlappende Geschwister Widgets (Ihr wx.StaticBitmaps in diesem Fall) und das Verhalten von dem, was passiert, wenn Sie versuchen, dies zu tun nicht definiert ist. Darüber hinaus sind Sizers nicht dazu ausgelegt, Objekte zu überlappen, was ihrem grundsätzlichen Zweck IMO zuwiderläuft.

Sie können jedoch die Bitmaps einfach selbst zeichnen, ohne ein Widget für jedes einzelne zu verwenden, und sie müssen sich so oft oder so wenig überlappen, wie Sie benötigen. Um dies zu tun, können Sie die EVT_PAINT Methode in einer Klasse basierend auf wx.Window oder wx.Panel behandeln und zeichnen Sie die Bitmaps in diesem Paint-Handler und dann eine Instanz dieses Fensters in Ihrem Rahmen. Es gibt viele Beispiele für das Zeichnen eines Farbmanagers in der Demo und verschiedene Tutorials.